会将Object转换成Message Message createMessage(Object object, MessageProperties messageProperties)
SimpleMessageListenerContainer容器监听消息时,会调用SimpleMessageListenerContainer.messageListener的消息转换器将Message转换成对象 Object fromMessage(Message message)
如果是 byte[] 或者 String 类型,直接获取字节 String.getBytes(this.defaultCharset) 设置messageProperties的 contentType = text/plain 如果是其他对象,调用 SerializationUtils.serialize(object) 进行序列化 设置messageProperties的 contentType = application/x-java-serialized-object
序列化时,Object 转成 json字符串在设置到 Message.body()中。 调用的是 jackson的序列化方式
反序列化时,将 Message.body()内容反序列化成 Object
@Bean public Jackson2JsonMessageConverter producerJackson2MessageConverter() { return new Jackson2JsonMessageConverter(); }
RabbitAutoConfiguration 配置 发送端 RabbitTemplate
RabbitAnnotationDrivenConfiguration 配置接收端 SimpleRabbitListenerContainerFactory
@Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageProcess messageProcess) { ReliableRabbitTemplate template = new ReliableRabbitTemplate(messageProcess); template.setConnectionFactory(connectionFactory); template.setMessageConverter(new Jackson2JsonMessageConverter()); }
发送端:
ProjectInfoDto projectInfoDto = new ProjectInfoDto(); projectInfoDto.setId(String.valueOf(System.currentTimeMillis())); projectInfoDto.setProjectName("测试项目"); rabbitTemplate.sendMsgAndSaveRecord(ProjectMqConstants.PROJECT_DELETE_QUEUE, projectInfoDto.getId(), ProjectMqConstants.CONTRACT_OR_PROJECT_EXCHANGE, ProjectMqConstants.PROJECT_DELETE_QUEUE, projectInfoDto);
@RabbitListener(bindings = @QueueBinding( value = @Queue(value = ProjectMqConstants.PROJECT_DELETE_QUEUE, durable = "true", autoDelete = "false"), exchange = @Exchange(value = ProjectMqConstants.CONTRACT_OR_PROJECT_EXCHANGE, type = ExchangeTypes.DIRECT), key = ProjectMqConstants.PROJECT_DELETE_QUEUE)) public void projectCanDelete(@Payload ProjectInfoDto data, Message message, Channel channel) { }
报错为:
消息转换错误,消息被拒绝