Spring启动RabbitMQ空指针异常错误
Spring Boot RabbitMQ Null Pointer Exception Error
我正在使用 RabbitMQ Spring 引导到两个服务之间的代理消息。我能够接收消息并对其进行格式化,但是当我在 onMessage 方法中调用服务 class 时,出现空指针异常错误。这是我的消息侦听器 class,它接收消息
public class QueueListener implements MessageListener{
@Autowired
private QueueProcessor queueProcessor;
@Override
public void onMessage(Message message) {
String msg = new String(message.getBody());
String output = msg.replaceAll("\\", "");
String jsonified = output.substring(1, output.length()-1);
JSONArray obj = new JSONArray(jsonified);
queueProcessor.processMessage(obj);
}
}
调用方法processMessage抛出空指针异常
谁能指出我做错了什么?
我发现问题出在 RabbitMqConfig class 中。这是导致错误的代码:
@Configuration
public class RabbitMqConfig {
private static final String QUEUE_NAME = "my.queue.name";
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("<url.to.rabbit>");
connectionFactory.setUsername("<username>");
connectionFactory.setPassword("<password>");
return connectionFactory;;
}
@Bean
public Queue simpleQueue() {
return new Queue(QUEUE_NAME);
}
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
template.setRoutingKey(QUEUE_NAME);
template.setMessageConverter(jsonMessageConverter());
return template;
}
@Bean
public SimpleMessageListenerContainer userListenerContainer() {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory());
listenerContainer.setQueues(simpleQueue());
listenerContainer.setMessageConverter(jsonMessageConverter());
listenerContainer.setMessageListener(new QueueListener());
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
return listenerContainer;
}
}
第 listenerContainer.setMessageListener(new QueueListener());
行是错误的来源。我通过自动装配 class 而不是使用新的来解决它。这是工作代码
@Configuration
public class RabbitMqConfig {
private static final String QUEUE_NAME = "my.queue.name";
@Autowired
private QueueListener queueListener;
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("<url.to.rabbit>");
connectionFactory.setUsername("<username>");
connectionFactory.setPassword("<password>");
return connectionFactory;
}
@Bean
public Queue simpleQueue() {
return new Queue(QUEUE_NAME);
}
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
template.setRoutingKey(QUEUE_NAME);
template.setMessageConverter(jsonMessageConverter());
return template;
}
/*@Bean
public SimpleMessageListenerContainer userListenerContainer() {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory());
listenerContainer.setQueues(simpleQueue());
listenerContainer.setMessageConverter(jsonMessageConverter());
listenerContainer.setMessageListener(queueListener);
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
return listenerContainer;
}
}
希望这对其他人有帮助
确保 QueueListener
是可以由 Spring [=13] 管理的 component
class 或 service
class =].否则,配置 class 无法使它成为开箱即用的 bean
,因为这只是一个需要在容器 @runtime 中的普通 Java class。
所以当你在配置 class 中写入 new QueueListener()
时,Java class 不在配置时的 SpringContext
中class 被实例化,因此是 null
.
希望这有助于解决部分问题!
我正在使用 RabbitMQ Spring 引导到两个服务之间的代理消息。我能够接收消息并对其进行格式化,但是当我在 onMessage 方法中调用服务 class 时,出现空指针异常错误。这是我的消息侦听器 class,它接收消息
public class QueueListener implements MessageListener{
@Autowired
private QueueProcessor queueProcessor;
@Override
public void onMessage(Message message) {
String msg = new String(message.getBody());
String output = msg.replaceAll("\\", "");
String jsonified = output.substring(1, output.length()-1);
JSONArray obj = new JSONArray(jsonified);
queueProcessor.processMessage(obj);
}
}
调用方法processMessage抛出空指针异常
谁能指出我做错了什么?
我发现问题出在 RabbitMqConfig class 中。这是导致错误的代码:
@Configuration
public class RabbitMqConfig {
private static final String QUEUE_NAME = "my.queue.name";
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("<url.to.rabbit>");
connectionFactory.setUsername("<username>");
connectionFactory.setPassword("<password>");
return connectionFactory;;
}
@Bean
public Queue simpleQueue() {
return new Queue(QUEUE_NAME);
}
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
template.setRoutingKey(QUEUE_NAME);
template.setMessageConverter(jsonMessageConverter());
return template;
}
@Bean
public SimpleMessageListenerContainer userListenerContainer() {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory());
listenerContainer.setQueues(simpleQueue());
listenerContainer.setMessageConverter(jsonMessageConverter());
listenerContainer.setMessageListener(new QueueListener());
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
return listenerContainer;
}
}
第 listenerContainer.setMessageListener(new QueueListener());
行是错误的来源。我通过自动装配 class 而不是使用新的来解决它。这是工作代码
@Configuration
public class RabbitMqConfig {
private static final String QUEUE_NAME = "my.queue.name";
@Autowired
private QueueListener queueListener;
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("<url.to.rabbit>");
connectionFactory.setUsername("<username>");
connectionFactory.setPassword("<password>");
return connectionFactory;
}
@Bean
public Queue simpleQueue() {
return new Queue(QUEUE_NAME);
}
@Bean
public MessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
template.setRoutingKey(QUEUE_NAME);
template.setMessageConverter(jsonMessageConverter());
return template;
}
/*@Bean
public SimpleMessageListenerContainer userListenerContainer() {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory());
listenerContainer.setQueues(simpleQueue());
listenerContainer.setMessageConverter(jsonMessageConverter());
listenerContainer.setMessageListener(queueListener);
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
return listenerContainer;
}
}
希望这对其他人有帮助
确保 QueueListener
是可以由 Spring [=13] 管理的 component
class 或 service
class =].否则,配置 class 无法使它成为开箱即用的 bean
,因为这只是一个需要在容器 @runtime 中的普通 Java class。
所以当你在配置 class 中写入 new QueueListener()
时,Java class 不在配置时的 SpringContext
中class 被实例化,因此是 null
.
希望这有助于解决部分问题!