Spring整合ActiveMQ监听器反复抛出“Property name cannot be null”异常
Spring整合ActiveMQ遇"Property name cannot be null"无限重复异常
在两次实现Spring整合ActiveMQ的过程中,均遇到同一问题:无论是通过Postman发送HTTP请求,还是直接在ActiveMQ控制台发送消息,都会无限重复抛出异常,核心错误为Property name cannot be null。即使将监听器改为空实现,日志和断点都无法触发,异常依然持续出现。
以下是问题应用代码:
JmsConfig
@Configuration @EnableJms public class JmsConfig { Logger logger = LoggerFactory.getLogger(JMSErrorHandler.class); @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory( ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer, JMSErrorHandler defaultErrorHandler){ DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory(); jmsListenerContainerFactory.setConnectionFactory(connectionFactory); jmsListenerContainerFactory.setConcurrency("1"); jmsListenerContainerFactory.setErrorHandler(defaultErrorHandler); jmsListenerContainerFactory.setMessageConverter(this.jacksonJmsMessageConverter()); configurer.configure(jmsListenerContainerFactory, connectionFactory); return jmsListenerContainerFactory; } @Service public class JMSErrorHandler implements ErrorHandler { @Override public void handleError(Throwable t) { logger.error("Error in listener ", t); } } @Bean public MessageConverter jacksonJmsMessageConverter() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); converter.setTargetType(MessageType.TEXT); converter.setObjectMapper(new ObjectMapper()); return converter; } }
PublishController
package com.jackhodge.activemqlearning.controller; import com.jackhodge.activemqlearning.model.SystemMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.jms.core.JmsTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class PublishController { private JmsTemplate jmsTemplate; @Autowired public PublishController(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } @PostMapping("/publishMessage") public ResponseEntity<String> publishMessage(@RequestBody SystemMessage systemMessage){ try{ jmsTemplate.convertAndSend("jackhodge-queue", systemMessage.toString()); return new ResponseEntity<>("I, Jack Hodge, sent your message.", HttpStatus.OK); } catch (Exception e){ return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } }
SystemMessage
package com.jackhodge.activemqlearning.model; import lombok.Setter; @Setter public class SystemMessage { private String source; private String message; public SystemMessage(String source, String message) { this.source = source; this.message = message; } @Override public String toString() { return "SystemMessage{" + "source='" + source + '\'' + ", message='" + message + '\'' + '}'; } }
MessageConsumer
package com.jackhodge.activemqlearning.consumer.component; import com.jackhodge.activemqlearning.model.SystemMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class MessageConsumer { public static final Logger LOGGER = LoggerFactory.getLogger(MessageConsumer.class); @JmsListener(destination = "jackhodge-queue") public void messageListener(SystemMessage systemMessage){ LOGGER.info("Message Received {}", systemMessage); } }
测试请求示例(两种发送方式均报错):
{ "source":"jeff bezo", "message":"hello" }
本人对Spring和ActiveMQ较为陌生,已尝试通过断点、日志排查但无果,恳请帮助解决该问题。
内容的提问来源于stack exchange,提问作者Jack Hodge
相关产品推荐
相关产品推荐

