Springboot为了应对高并发,接入了消息队列Rabbitmq,第一版验证时使用简单消费队列:

//发送端
AbstractOrder order =new Order();
rabbitmqTemplate.convertAndSend(order); //消费端
public void recieved(AbstractOrder order){
log.info("recieved order:"+order);
//处理逻辑
}

第二版为了应对可能出行的处理失败,使用了Rabbitmq的Ack

下面是最终版代码:

//发送端
//把订单加入队列
public void convertAndSendOrder(AbstractOrder order){ rabbitmqTemplate.setMandatory(true);
rabbitmqTemplate.setConfirmCallback(confirmCallback);
rabbitmqTemplate.setReturnCallback(returnCallback);
//全局唯一 不然ReturnCallback 无效
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitmqTemplate.convertAndSend("exchange-order","rkey-orderadd",order,correlationData);
}
//消费端逻辑
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = "queue-order"),
exchange = @Exchange(value = "exchange-order"),
key = "rkey-order")},containerFactory="rabbitListenerContainerFactory")
public void recieved(Message messageorigin, Channel channel){
log.info("recieved message:"+messageorigin);
boolean success = false; Order order =null; try {
Jackson2JsonMessageConverter jackson2JsonMessageConverter =new Jackson2JsonMessageConverter();
order = (Order)jackson2JsonMessageConverter.fromMessage(messageorigin); }catch (Exception e){
log.info("get order fromBytes message exception"+e.getMessage());
} //处理逻辑
//回调成功确认消息
if(success){
//成功确认消息
try{
channel.basicAck(messageorigin.getMessageProperties().getDeliveryTag(),false);
}catch (IOException e){
log.info("basicAck ex:"+e.getMessage());
try{
channel.basicAck(messageorigin.getMessageProperties().getDeliveryTag(),false);
}catch (IOException ee){
log.info("again basicAck ex:"+ee.getMessage()); }
}
}

注意:如果在received 中还像第一版直接转自定义对象,消息进程会报错

org.springframework.amqp.AmqpException: No method found for class com.xxx.Order

解决方案是使用Jackson2JsonMessageConverter 。在发送消息时,它会先将自定义的消息类序列化成json格式,再转成byte构造 Message

//发送 设置Converter
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(new Jackson2JsonMessageConverter());
return template;
} @Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
} //消费时 指定Converter
    @RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = "queue-order"),
exchange = @Exchange(value = "exchange-order"),
key = "rkey-order")},containerFactory="rabbitListenerContainerFactory")
 

但是直接使用Jackson2JsonMessageConverter后,反序列化时要求发送的类和接受的类完全一样(字段,类名,包路径)。

查了下 文档 https://docs.spring.io/spring-amqp/api/org/springframework/amqp/support/converter/Jackson2JsonMessageConverter.html

这里直接使用jackson2JsonMessageConverter.fromMessage的方法从Message拿出来。

ACK完成



Springboot Rabbitmq 使用Jackson2JsonMessageConverter 消息传递后转对象的更多相关文章

  1. springboot + rabbitmq 用了消息确认机制,感觉掉坑里了

    本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步 最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI ...

  2. springboot+rabbitmq整合示例程

    关于什么是rabbitmq,请看另一篇文: http://www.cnblogs.com/boshen-hzb/p/6840064.html 一.新建maven工程:springboot-rabbit ...

  3. SpringBoot RabbitMQ 延迟队列代码实现

    场景 用户下单后,如果30min未支付,则删除该订单,这时候就要可以用延迟队列 准备 利用rabbitmq_delayed_message_exchange插件: 首先下载该插件:https://ww ...

  4. springboot rabbitmq 死信队列应用场景和完整demo

    何为死信队列? 死信队列实际上就是,当我们的业务队列处理失败(比如抛异常并且达到了retry的上限),就会将消息重新投递到另一个Exchange(Dead Letter Exchanges),该Exc ...

  5. springboot + rabbitmq 做智能家居,我也没想到会这么简单

    本文收录在个人博客:www.chengxy-nds.top,共享技术资源,共同进步 前一段有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技术栈都颇为好奇 ...

  6. LOB对象在数据泵导出、导入后查询对象数量发现丢失

    问题描述:问题:源库的某个Schema使用数据泵Expdp元数据整体导出,在目标库导入且成功后,逻辑验证用户对象,发现缺失.分析查询后,缺失的对象,都是LOB类型(并不是所有的LOB都无法导入,是大部 ...

  7. SpringBoot项目打成jar包后上传文件到服务器 目录与jar包同级问题

    看标题好像很简单的样子,但是针对使用jar包发布SpringBoot项目就不一样了.当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源.但是当你使用Sp ...

  8. springboot升级到2.0后context-path配置不起作用

    springboot升级到2.0后,context-path配置不起作用,改成了: server.servlet.context-path=/projname

  9. springboot打包成jar包后找不到xml,找不到主类的解决方法

    springboot打包成jar包后找不到xml,找不到主类的解决方法 请首先保证你的项目能正常运行(即不打包的时候运行无误),我们在打包时经常遇到如下问题: springboot打包成jar包后找不 ...

随机推荐

  1. Docker Gitlib创建项目后仓库连接IP地址不一致问题(包括进入docker中容器命令及退出命令)

    首次在内网搭建Gitlab环境,在成功后在Gitlab上新建了一个项目. 然而在IDEA上clone项目时发现,项目地址如下: git@0096ce63c43f:root/jump.git 或者这样 ...

  2. The Reset Method of Te Philips VTR 5210

    Pull down and hold the ON/OFF buttun, Then press the play button

  3. JAVA图形小动画之简单行星运动

    //第一个java文件thread_star.java: package solarsystem; import java.awt.Color;import java.awt.Graphics;imp ...

  4. 前端vue的get和post请求

    vue的get和post需要两个文件vue.js和vue-resource.js 以下是实现的代码,可以参考一下,需要注意的接口的请求需要考虑跨域的问题,其次就是访问页面需要在tomcat下访问,否则 ...

  5. 预处理、const、static与sizeof-用#define实现宏并求最大值和最小值

    1:实现代码: #define MAX(x,y) (((x)>(y)) ? (x):(y)) #define MIN(x,y) (((x)>(y)) ? (x):(y)) 需要注意的几点: ...

  6. JS基础_数组的遍历

    遍历:将数组中所有的元素都取出来 1.for循环 var arr = ["1","2","3"]; for(let i=0;i<arr ...

  7. 通过Maven更换环境配置文件

    大致思路:配置文件有三套:main/resources.devmain/resources.prodmain/resources.test公共部分放到main/resource下使用mvn clean ...

  8. Docker Image

    Docker 对 container 的使用基本是建立在 LXC 基础之上,然而 LXC 存在的问题是难以移动,难以通过标准化的模板去制作.重建.复制和移动 container. 在以 VM 为基础的 ...

  9. pi币--π币--手机离线式挖矿软件--pi中文教程!

    Pi Network派型网络,国外热度很高手机移动式挖矿软件 一个新出的手机移动式挖矿软件,在国外热度很高,国内玩的人目前很少.项目团队成员均来自斯坦福大学,三个创始人斯坦福博士教授,现在处于挖矿第一 ...

  10. SpringCloud(六)之 网关概念、Zuul项目搭建-(利用Zuul 实现鉴权和限流实战)

    一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控.缓存.限流等功能.它将"1对N"问题转换成 ...