赞
踩
- 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 序列化的方式。
二、 如果生产者不想序列化,不进行改动,消费者可以直接用对象接收消费的消息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。