简体   繁体   English

如何通过Web API调用从Kafka使用者获取特定消息?

[英]How to obtain a specific message from Kafka consumer in a web API call?

I'm writing a web application where the user can send a request for messages received in a Kafka consumer. 我正在编写一个Web应用程序,用户可以在其中发送对在Kafka使用者中收到的消息的请求。 I tried to do this by putting a Map object in the session, and then upon receiving the message put the message in the Map object. 我试图通过将Map对象放入会话中,然后在收到消息后将消息放入Map对象中来做到这一点。 Meanwhile in the request-dealing method use a loop to check if the Map is filled with the message. 同时,在请求处理方法中,使用循环来检查Map是否被消息填充。 Now the problem is that I can't manage to obtain the session object in the consumer object so it doesn't work out this way. 现在的问题是,我无法在消费者对象中获取会话对象,因此无法通过这种方式解决。 And also if there any other way to do this please let me know. 另外,如果还有其他方式可以做到这一点,请告诉我。

Here's the request-dealing method: 这是请求处理方法:

@Override
public Map<String, Object> getKeyValueMap(String pileCode) {
    String uniqueId = "GetConfiguration" + new Date().getTime();
    session.setAttribute("uniqueId", uniqueId);

    GetConfigurationReq obj = new GetConfigurationReq();
    obj.setKey("getConfiguration");
    GetConfigurationReq.Data data = new GetConfigurationReq.Data();
    data.setConnector(pileCode);
    data.setUniqueId(uniqueId);
    List<KeyValue> keyValue = new ArrayList<>();
    for (int i = 0; i < KeyConstant.PARAMS.length; i++) {
        KeyValue temp = new KeyValue();
        temp.setKey(KeyConstant.PARAMS[i]);
        temp.setValue("0");
        keyValue.add(temp);
    }
    data.setKeyValue(keyValue);
    obj.setData(data);
    String msg = new Gson().toJson(obj);
    ConnectorChargingOperationProducer producer = new ConnectorChargingOperationProducer();
    producer.responseOperation(KeyConstant.KAFKA_PUB, "getConfiguration", msg);

    Map params = (Map) session.getAttribute("params");
    try {
        int n = 0;
        while (params.size() == 0) {
            Thread.sleep(1000);
            n++;
            if (n == 20) {
                System.out.printf("After %s seconds waiting timeout%n", n);
                break;
            }
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return params;
}

The consumer class: 消费类:

public class ConnectorChargingOperationConsumer implements MessageListener<String,String> {
private static Logger logger = LogManager.getLogger(ConnectorChargingOperationConsumer.class);

@Autowired
HttpSession session;

@Override
public void onMessage(ConsumerRecord<String, String> consumerRecord) {
    String message = consumerRecord.value();
    System.out.println("xxx: " + message);
    logger.info("yyy: " + message);
    Gson gson = new Gson();
    JsonObject respObj = gson.fromJson(message, JsonObject.class);
    JsonElement uniqueId = respObj.get("uniqueId");
    if (uniqueId != null) {
        String uniqueId2 = (String) session.getAttribute("uniqueId");
        if (uniqueId.getAsString().equals(uniqueId2)) {
            GetConfigurationResp resp = gson.fromJson(respObj, GetConfigurationResp.class);
            List<KeyValue> keyValue = resp.getKeyValue();
            Map params = (Map) session.getAttribute("params");
            for (int i = 0; i < keyValue.size(); i++) {
                KeyValue temp = keyValue.get(i);
                params.put(temp.getKey(), temp.getValue());
            }
        }
    }
}
}

Exceptions thrown when called: 调用时引发的异常:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'messageListernerConsumerService': Unsatisfied dependency expressed through field 'session': No qualifying bean of type [javax.servlet.http.HttpSession] found for dependency [javax.servlet.http.HttpSession]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.servlet.http.HttpSession] found for dependency [javax.servlet.http.HttpSession]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.yunshan.openCharge.kafka.ConnectorChargingOperationProducer.responseOperation(ConnectorChargingOperationProducer.java:30)
at com.yunshan.openCharge.service.impl.PileServiceImpl.getKeyValueMap(PileServiceImpl.java:260)
at com.yunshan.openCharge.controller.PileController.getParameters(PileController.java:158)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.servlet.http.HttpSession] found for dependency [javax.servlet.http.HttpSession]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1406)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1057)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
... 59 more

I solved the problem eventually by using a static Map field in the consumer class instead of trying to put it in the session, namely: 我最终通过在消费者类中使用静态Map字段而不是尝试将其放入会话中来解决了该问题,即:

replace: 更换:

@Autowired
HttpSession session;

with

public static final Map<String, Object> PARAMS = new HashMap<>();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM