即使在消费者端的 rabbitmq 队列中有消息,也会获取 NULL

Getting NULL even-though messages are there in rabbitmq queue at consumer end

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

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);

这里是堆栈跟踪:

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

此外,根据文档,如果队列中没有任何消息,它 returns 为空,但我确认消息在队列中并准备好使用。但仍然是 NPE 请建议

此致,

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

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

当然你会得到一个 NPE,因为模板是,呃,null !!!!

为什么那里有模板?

我已经解释过 你的 reply() 方法需要一个参数...

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

没有参数时;框架只是调用您的方法,没有来自消息的数据。