🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 定义队列 ~~~ import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitConfig { @Bean public Queue objectQueue() { return new Queue("object"); } } ~~~ # 定义对象 需要实现序列化接口, 因为传输对象需要对象的序列化和反序列化 ~~~ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { private static final long serialVersionUID = 1321L; private Integer id; private String username; } ~~~ # 发送 参数也可以用Object, 自己转换然后用json序列化. **发送的时候,就发送对象,不要发.toString()或者再来个字符串拼接的,那种序列化不了** ~~~ import com.jdxia.pojo.User; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class NeoSender { @Autowired private AmqpTemplate rabbitTemplate; public void send(User user) { String context = user.toString(); System.out.println("Sender1 : " + context); //直接发送对象, 不要 发这种 "字符串" + 对象.toString(); 这样反序列化解不开 this.rabbitTemplate.convertAndSend("object", user); } } ~~~ # 接收 参数也可以用Object, 自己转换然后用json反序列化 ~~~ import com.jdxia.pojo.User; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component @RabbitListener(queues = "object") public class NeoReceiver1 { @RabbitHandler public void process(User user) { System.out.println("Receiver 1: " + user); } } ~~~ # 测试 ~~~ @Autowired private NeoSender neoSender; @Test public void test() throws InterruptedException { User user = new User(); user.setId(11); user.setUsername("hello world"); neoSender.send(user); Thread.sleep(100L); } ~~~ # 自定义序列化方式 用Jackson进行对象的序列化和反序列化 ~~~ package com.jdxia.rabbitmq; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.ContentTypeDelegatingMessageConverter; 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 RabbitAdmin rabbitTemplate(ConnectionFactory connectionFactory) { return new RabbitAdmin(connectionFactory); } @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) { RabbitTemplate template = new RabbitTemplate(connectionFactory); template.setMessageConverter(messageConverter); return template; } @Bean public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory, MessageConverter messageConverter) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); //指定Json转换器 factory.setMessageConverter(messageConverter); return factory; } @Bean public MessageConverter messageConverter() { return new ContentTypeDelegatingMessageConverter(new Jackson2JsonMessageConverter()); } } ~~~ 消息队列里面存储的是json ~~~ {"id":11,"username":"hello world"} ~~~ # 注意 出现这个 因为你生产者传过去的实体类对象需要实现序列化 implements Serializable。 如果还是一样的错,你就得去RabbitMQ客户端上的队列消息先删除,因为那些队列消息还是原先的错误的消息。你再重新开程序,就没问题了。 还有传递的时候,直接传对象,不要 传难以序列化的, 导致消费者无法序列化 ~~~ 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 ~~~