我有以下代码来读取消费者端指定队列中的消息。基本上,我想先在队列中阅读消息并根据消息内容,做某些事情来决定发送回复内容......这里是代码
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 请建议
此致
答案 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();
}
没有争论的时候;框架只调用你的方法而没有来自消息的数据。