我曾try 在两个地方使用Spring实现ActiveMQ.这两种实现都有这个问题.使用postman 发送HTTP请求或直接在ActiveMQ控制台中输入消息都会导致以下错误无限重复:

2024-02-02T17:08:56.317-06:00 ERROR 2264 --- [ntContainer#0-1] c.j.a.config.JmsConfig$JMSErrorHandler   : Error in listener
org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'public void com.jackhodge.activemqlearning.consumer.component.MessageConsumer.messageListener(com.jackhodge.activemqlearning.model.SystemMessage)' threw exception
  at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:84) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:783) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:741) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:719) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:333) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1258) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1248) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1141) ~[spring-jms-6.1.3.jar:6.1.3]
  at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
Caused by: java.lang.NullPointerException: Property name cannot be null
  at org.apache.activemq.command.ActiveMQMessage.getObjectProperty(ActiveMQMessage.java:575) ~[activemq-client-jakarta-5.18.3.jar:5.18.3]
  at org.apache.activemq.command.ActiveMQMessage.getStringProperty(ActiveMQMessage.java:683) ~[activemq-client-jakarta-5.18.3.jar:5.18.3]
  at org.springframework.jms.support.converter.MappingJackson2MessageConverter.getJavaTypeForMessage(MappingJackson2MessageConverter.java:456) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.support.converter.MappingJackson2MessageConverter.fromMessage(MappingJackson2MessageConverter.java:241) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener.extractMessage(AbstractAdaptableMessageListener.java:250) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter.extractPayload(AbstractAdaptableMessageListener.java:472) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage.unwrapPayload(AbstractAdaptableMessageListener.java:539) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage.getPayload(AbstractAdaptableMessageListener.java:521) ~[spring-jms-6.1.3.jar:6.1.3]
  at org.springframework.messaging.handler.annotation.support.PayloadMethodArgumentResolver.resolveArgument(PayloadMethodArgumentResolver.java:122) ~[spring-messaging-6.1.3.jar:6.1.3]
  at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:118) ~[spring-messaging-6.1.3.jar:6.1.3]
  at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:147) ~[spring-messaging-6.1.3.jar:6.1.3]
  at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:115) ~[spring-messaging-6.1.3.jar:6.1.3]
  at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:110) ~[spring-jms-6.1.3.jar:6.1.3]
  ... 10 common frames omitted

脱颖而出的是Error in listener [...] Property name cannot be null.

当我在监听程序中不执行任何操作,并且messageListener中的日志(log)/断点既不发送也不激活时,仍然会出现错误.

以下是出现错误的简单应用程序:

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"); // start w/ 5 consumers; auto-scale to 10 consumers as necessary
    
        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**

```java
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;

@RestControllerpublic class PublishController {// helperclass for sending/receiving messages
    // Spring JMS abstraction API: Distills and simplifies process; abstracts away boilerplate code
    private JmsTemplate jmsTemplate;

    @Autowired
    public PublishController(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    // post method to trigger publishing of messages
    // Requests to here at sent to the Messaging Broker
    @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;
import org.springframework.beans.factory.annotation.Autowired;
//import java.io.Serializable;

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

@Componentpublic class MessageConsumer {

    public static final Logger LOGGER = LoggerFactory.getLogger(MessageConsumer.class);
    
    // Consumes from the Messaging broker
    @JmsListener(destination = "jackhodge-queue")
    public void messageListener(SystemMessage systemMessage){
        LOGGER.info("Message Received {}", systemMessage);
    }

}

我对Swing和ActiveMQ有些陌生,这个问题一直困扰着我--我已经try 了断点/日志(log)/消息源的每一种方法.谢谢大家!

无论如何,通过Postman和ActiveMQ控制台发送此请求都会导致相同的错误:

{     
    "source":"jeff bezo",     
    "message":"hello" 
}

推荐答案

我通过在MessageConverter Bean中设置setTypeIdPropertyName修复了此问题:

@Bean
public MessageConverter jacksonJmsMessageConverter(){
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        converter.setObjectMapper(new ObjectMapper());
        return converter;
    }

Java相关问答推荐

收听RDX中用户数据的变化

CriteriaQuery with max

当一个链表中间有一个循环时,它的松散部分会发生什么?

如何在Android上获取来电信息

H2弹簧靴试验跌落台

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

SpringBootreact 式Web应用程序的Spring Cloud Configer服务器中的资源控制器损坏

FALSE:它应该在什么时候使用?

名称冲突具有相同的擦除

有没有办法让扩展变得多态?

如何在Microronaut中将 map 读取为 map

为什么同步数据块无效?

Android应用程序为错误的显示类型 Select 尺寸文件

如何根据配置动态创建N个bean

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

为什么项目名称出现在我的GET请求中?

使用MediaPlayer类在一段时间后停止播放音乐

获取月份';s在java中非UTC时区的开始时间和结束时间

使用DynamoDB增强客户端时未更新属性

Hibernate 命名策略导致 Java Spring Boot 应用程序中出现未知列错误