2019-07-30 11:25:05.686  WARN 23988 --- [cTaskExecutor-2] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exception
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:949) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:859) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:779) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:105) [spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:208) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1381) [spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:760) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1324) [spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1294) [spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1800(SimpleMessageListenerContainer.java:105) [spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1550) [spring-rabbit-1.7.10.RELEASE.jar:na]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
Caused by: org.springframework.amqp.support.converter.MessageConversionException: failed to resolve class name. Class not found [com.sse.mars.model.restful.message.RestfulMessage]
    at org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper.getClassIdType(DefaultJackson2JavaTypeMapper.java:181) ~[spring-amqp-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper.toJavaType(DefaultJackson2JavaTypeMapper.java:140) ~[spring-amqp-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.support.converter.Jackson2JsonMessageConverter.fromMessage(Jackson2JsonMessageConverter.java:189) ~[spring-amqp-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.extractMessage(AbstractAdaptableMessageListener.java:236) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter$MessagingMessageConverterAdapter.extractPayload(MessagingMessageListenerAdapter.java:222) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.support.converter.MessagingMessageConverter.fromMessage(MessagingMessageConverter.java:118) ~[spring-amqp-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.toMessagingMessage(MessagingMessageListenerAdapter.java:122) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:108) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:856) ~[spring-rabbit-1.7.10.RELEASE.jar:na]
    ... 10 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.sse.mars.model.restful.message.RestfulMessage
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_131]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_131]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_131]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_131]
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:251) ~[spring-core-4.3.19.RELEASE.jar:4.3.19.RELEASE]
    at org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper.getClassIdType(DefaultJackson2JavaTypeMapper.java:177) ~[spring-amqp-1.7.10.RELEASE.jar:na]
    ... 18 common frames omitted

一、        是因为你生产者传过去的实体类对象需要实现序列化 implements Serializable。

        如果还是一样的错,你就得去RabbitMQ客户端上的队列消息先删除,因为那些队列消息还是原先的错误的消息。你再重新开程序,就没问题了。

使用mq发送消息:

使用 org.springframework.amqp.rabbit.core.RabbitTemplate 来发送消息到 RabbitMQ 队列时,消息的序列化是由 MessageConverter 完成的。默认情况下,RabbitTemplate 使用 SimpleMessageConverter,它可以处理简单的消息类型(如字符串、字节数组等),但如果您希望发送自定义对象,则需要配置一个适当的 MessageConverter 来序列化和反序列化这些对象。

以下是一种常见的方法,您可以使用 Jackson 库将对象序列化为 JSON 格式并发送到 RabbitMQ 队列:

1、添加 Jackson 依赖项到您的项目中,如果您使用 Maven,可以添加以下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.5</version> <!-- 请根据您的项目需要使用适当的版本 -->
</dependency>

2、配置 RabbitTemplate 使用 Jackson2JsonMessageConverter 作为消息转换器:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate rabbitTemplate = new RabbitTemplate();
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        // 设置 RabbitMQ 服务器地址等其他配置
        return rabbitTemplate;
    }
}

上述配置使用了 Jackson2JsonMessageConverter,它将对象转换为 JSON 格式并发送到 RabbitMQ 队列。您可以将此配置类添加到您的 Spring Boot 项目中,或根据您的项目结构和需求进行适当的配置。

3、使用 RabbitTemplate 发送消息:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MessageService {

    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public MessageService(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendMessage(MyCustomObject payload) {
        rabbitTemplate.convertAndSend("exchangeName", "routingKey", payload);
    }
}

在上述示例中,MyCustomObject 是您要发送的自定义对象。RabbitTemplate 会将其序列化为 JSON 格式并发送到指定的 RabbitMQ 队列。

通过这种配置,您可以轻松地将自定义对象序列化为 JSON 并发送到 RabbitMQ 队列中。请确保您的自定义对象具有适当的 Jackson 注解(如 @JsonProperty)以控制 JSON 序列化的方式。

二、        如果生产者不想序列化,不进行改动,消费者可以直接用对象接收消费的消息。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐