rabbitMQ异常:Execution of Rabbit message listener failed.
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.Li...
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 序列化的方式。
二、 如果生产者不想序列化,不进行改动,消费者可以直接用对象接收消费的消息。
更多推荐
所有评论(0)