获取NULL偶数 - 尽管消息存在于消费者端的{Rabbit}队列中

时间:2018-05-26 10:48:25

标签: java nullpointerexception spring-amqp

我有以下代码来读取消费者端指定队列中的消息。基本上,我想先在队列中阅读消息并根据消息内容,做某些事情来决定发送回复内容......这里是代码

public class RPCServer {

 public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
 SpringApplication.run(RPCServer.class, args);
 }


 private final static Logger logger = LoggerFactory.getLogger(RPCServer.class);


 private static final String RPC_QUEUE_NAME = "rpc_queue1";


 public RPCServer() throws IOException, TimeoutException {


 }


 @Bean
 public Queue queue() {
 return new Queue(RPC_QUEUE_NAME);
 }


 @Component
 public static class RpcListener {


 @RabbitListener(queues = RPC_QUEUE_NAME)
 public String reply() throws IOException, TimeoutException, ClassNotFoundException, SQLException {
 RabbitTemplate rabbitTemplate = null; 
 @SuppressWarnings("null")
 Object message = rabbitTemplate.receive(RPC_QUEUE_NAME);
 logger.info("Sent Message was: " + message);
                        // some processing 
                       return response;
      }
}
}

没有得到代码中的问题。使用spring AMQP核心框架进行所有编码。 将NPE放在以下行:

Object message = rabbitTemplate.receive(RPC_QUEUE_NAME);

这是stacktrace:

Caused by: java.lang.NullPointerException: null
        at com.infy.ci.unitdbamqpservice.RPCServer$RpcListener.reply(RPCServer.java:49) ~[classes!/:0.0.1-SNAPSHOT]
        at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_151]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_151]
        at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:180) ~[spring-messaging-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:112) ~[spring-messaging-4.3.14.RELEASE.jar!/:4.3.14.RELEASE]
        at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:49) ~[spring-rabbit-1.7.6.RELEASE.jar!/:na]
        at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:126) ~[spring-rabbit-1.7.6.RELEASE.jar!/:na]
        ... 12 common frames omitted

此外,根据文档,如果队列没有任何消息,它返回null但我确认,消息是有队列并准备消耗。但仍然是NPE 请建议

此致

1 个答案:

答案 0 :(得分:2)

你是认真的吗?或者这只是一个巨魔?

RabbitTemplate rabbitTemplate = null; 
@SuppressWarnings("null")
Object message = rabbitTemplate.receive(RPC_QUEUE_NAME);

当然你得到一个NPE,因为模板是错误的,null !!!!

为什么你有一个模板呢?

我已经解释过in this answer您需要reply()方法的参数...

@RabbitListener(queues = RPC_QUEUE_NAME)
public String reply(String request) throws IOException, TimeoutException, ClassNotFoundException, SQLException {
    logger.info(request);
    return request.toUpperCase();
}

没有争论的时候;框架只调用你的方法而没有来自消息的数据。