多线程处理rabbitmq消息

问题描述:项目中接收到rabbitmq消息后,先进行一系列的处理,等所有处理完成后,将消息推送到前台,但是在处理消息的过程中,每个方法中都有与数据库交互的代码,直接导致消息推送不及时。

 

单线程代码模型:

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;public class MqHandler implements MessageListener {//消息处理public void onMessage(Message msg) {//处理AdealA(msg);//处理BdealB(msg);//处理CdealC(msg);//处理DdealD(msg);//处理EdealE(msg);//处理FdealF(msg);}public void dealA(Message msg){}public void dealB(Message msg){}public void dealC(Message msg){}public void dealD(Message msg){}public void dealE(Message msg){}public void dealF(Message msg){}
}

 

单线程处理图示:

 

解决方案:采用多线程的方式,每个线程处理一个或多个逻辑,提高CPU的使用率,优化消息响应时间。

多线程处理图示:

 

代码实现

一:配置spring线程池

<bean id="taskExecutor"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><!-- 核心线程数 --><property name="corePoolSize" value="10" /><!-- 最大线程数 --><property name="maxPoolSize" value="50" /><!-- 队列最大长度 >=mainExecutor.maxSize --><property name="queueCapacity" value="1000" /><!-- 线程池维护线程所允许的空闲时间 --><property name="keepAliveSeconds" value="300" /><!-- 线程池对拒绝任务(无线程可用)的处理策略 --><property name="rejectedExecutionHandler"><bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /></property>
</bean>

 

二:线程类

ABProcess:将方法A和方法B中的逻辑交给该线程处理

import java.util.ArrayList;
import java.util.List;import org.springframework.amqp.core.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;public class ABProcess implements Runnable {@Autowiredprivate ThreadPoolTaskExecutor taskExecutor;private List<Message> ABList = new ArrayList<Message>();// 初始化方法:启动线程public void init() {taskExecutor.execute(this);}/*** 对外提供添加数据的方法* ABList是共享资源,主线程MqHandler对此进行添加,子线程ABProcess对此进行删除,存在线程安全问题,所以需要加同步* notify():此方法必须在synchronized修饰的代码块或者方法中使用* @param msg*/public synchronized void addList(Message msg) {ABList.add(msg);notify(); // 唤醒在此对象监视器(锁)上等待的单个线程,}@Overridepublic void run() {while (true) {try {thread(); //调用实现方法} catch (Exception e) {e.printStackTrace();}}}/*** 因为涉及共享资源的操作,需要同步* wait():此方法必须在synchronized修饰的代码块或者方法中使用* @throws Exception*/public synchronized void thread() throws Exception {if (ABList.size() > 0) { // 判断集合中是否有消息dealA(ABList.get(0)); //方法AdealB(ABList.get(0));//方法BABList.remove(0); // 处理完后,删除这条数据System.out.println("dealABSuccess");} else {wait(); // 若集合中没有消息,让线程等待,}}public void dealA(Message msg) {}public void dealB(Message msg) {}}

spring配置配置Bean,并初始化init方法

<bean id="ABProcess" class="com.thread.ABProcess" init-method="init"/>

 

CDProcess:将方法C和方法D的逻辑交给该线程处理,具体实现与ABProcess一致

 

三:修改主线程MqHandler逻辑

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.beans.factory.annotation.Autowired;public class MqHandler implements MessageListener {@Autowiredprivate ABProcess acProcess;@Autowiredprivate CDProcess cdProcess;//消息处理public void onMessage(Message msg) {acProcess.addList(msg);//主线程将消息添加到集合,交给子线程ABProcess处理cdProcess.addList(msg);//主线程将消息添加到集合,交给子线程CDProcess处理//E和F逻辑代码简单,直接交给主线程dealE(msg);dealF(msg);}public void dealE(Message msg){}public void dealF(Message msg){}
}

 

需要熟悉回忆线程通信线程安全/同步的同仁,参考:https://blog.csdn.net/qq_37936542/article/details/81944583

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/251621.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序之『仿 QQ 消息气泡拖拽消失』

转载&#xff1a;请写明掘金原文链接及作者名 ‘小小小’ 一个潜心研究小程序QQ群&#xff1a;139128168 ← 点击加群 今天带来的是仿QQ消息气泡拖拽消失特效&#xff0c;源码中很多地方还是有很多不足&#xff0c;希望大家一起齐心协力&#xff0c;给我提出宝贵意见&#…

Telegram与QQ消息互转

最近做网站的推广,无意中在一个网站中看到一个支持TG群、QQ群消息互转的帖子( http://www.hoobg.com/2802/ ),正好我的网站又在这两个媒体平台有推广业务,所以我就想试试这个插件,真的是完全按照那个教程来的,到最后总是遇到一个问题:QQ群可以向TG群转发,但是TG群不能向…

Tasker配置 QQ消息朗读

神器就是神器啊.... Tasker介绍 长话短说&#xff0c;基础的读是没问题的&#xff0c;功能不如微信的多&#xff0c;但一小部分可能比微信的要好&#xff0c;下面简单的介绍。 如果导入失败&#xff0c;请升级Tasker版本&#xff08;目前5.8.3&#xff09;。解决"有n个…

3310复刻版 java_终于等到你:诺基亚3310复刻版开箱简评

终于等到你&#xff1a;诺基亚3310复刻版开箱简评 2017-08-19 20:14:21 60点赞 42收藏 222评论 自打今年年初说是诺基亚要出3310复刻版手机&#xff0c;心情是激动的。因为遥想10多年前第一次用诺基亚3310的时候&#xff0c;那些画面仍在眼前&#xff1a;自编铃声&#xff0c;贪…

刘强东:我只是一个呼喊公平竞争的市场主义者

有人调侃说刘强东是价格屠夫&#xff0c;说他浓缩了中国互联网“坏孩子”的一切特征。 而面对垄断的无奈和潜规则的横行&#xff0c;刘强东在微博上委屈地回应&#xff1a;“我只是一个四处呼喊公平竞争的市场主义者&#xff01;” 本刊记者薛芳发自北京 4 月上旬&#xff0c;刘…

复盘2021鲜花电商:行业波动过后迎新一轮混战和增长

春节临近&#xff0c;年宵花迎来了一年一度的销售高峰&#xff0c;其中红红火火的暖色系鲜花是年宵花的热门款。 与此同时&#xff0c;鲜花成为“盒区房”里的一件必买“年货”。自从春节年宵花上市以来&#xff0c;在门店的“盒马花园”陈列区现场挑选绿植盆栽的消费者增加了…

一文带你全面了解电商在线支付

本文由作者 书丰 发布于社区 在电商系统中&#xff0c;方便的在线支付功能大大推进了电商的发展&#xff0c;可以说没有在线支付的发展就没有今天发展完善的电商系统&#xff0c;本文就来讨论一下在线支付相关的内容。 01 网银支付 1. 什么是在线支付 在讨论在线支付前&#xf…

盈利背后,美团渴望第二曲线

配图来自Canva可画 8月26日&#xff0c;美团公布了第二季度财报&#xff1a;美团当季营收509.4亿元&#xff0c;同比增长16.4%&#xff1b;经营亏损4.9亿元&#xff0c;同比收窄84.8%&#xff0c;&#xff1b;但调整后利润是20.6亿元&#xff0c;和上个季度相同指标22.2亿元的…

「B端零售业」那些你不知道的事儿

前言&#xff1a; B端产品功能的发展&#xff0c;一定是行业发展现状和企业发展诉求在产品侧的映射。 同时&#xff0c;以我在的零售行业为例&#xff0c;新零售&#xff0c;社区团购&#xff0c;无人便利店&#xff0c;各种纷繁复杂的业务热点下同样也隐藏着清晰的行业发展脉络…

【电商】电商后台设计—电商支付

在日常购物中&#xff0c;我们常常需要用到在线支付功能。在线支付的发展也使得如今的电商系统越来越完善。 在电商系统中&#xff0c;方便的在线支付功能大大推进了电商的发展&#xff0c;可以说没有在线支付的发展就没有今天发展完善的电商系统&#xff0c;本文就来讨论一下在…

链表:虚拟头节点你会用吗?

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 前言&#xff1a;什么是链表 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指…

利润的来源:会员权益的前置和后置

一、会员收益 现有市场的会员产品中&#xff0c;其收益往往来自于两个方向: 一是通过对用户收取高会员费实行价格歧视进而达到直接增收的目的&#xff1b; 二是通过免费或者低会员费来进行拉新从而促进整体消费提升&#xff1b;亦或是增加用户的沉没成本&#xff0c;阻止用户…

【网络】UDP的应用场景

文章目录 翻译功能命令行解析网络聊天室UDP之Windows与Linux 翻译功能 我们写的UDP服务端并不是只接收到数据就完了&#xff0c;还需要进行处理任务。 我们可以在服务端udpServer.hpp中设置一个回调函数 _callback&#xff0c;具体的逻辑通过udpServer.cc中由外部进行传入 代…

如何免费制作证件照

&#xff08;1&#xff09;打开微信&#xff0c;在小程序中搜索【万能工具助手】 &#xff08;2&#xff09;打开万能工具助手 选择好证件照尺寸&#xff0c;导入图片&#xff0c;它会自动抠除照片的原背景&#xff0c;点击“背景色”更换证件照底色&#xff0c;点击“美颜”&a…

如何制作电子证件照?十秒学会这个方法

如何制作电子证件照&#xff1f;现如今我们只要在网站办事或者说是报名考试都会使用到电子版的证件照&#xff0c;可以说电子证件照的应用十分广泛。那么问题来了&#xff0c;电子证件照如何制作呢&#xff1f;其实制作电子证件照并不困难&#xff0c;我们自己就可以完成。这里…

免费在线证件照制作-超级好用

地址&#xff1a;https://www.remove.bg/ 步骤&#xff1a; 1. 上传图片 2. 生成的图片&#xff0c;右上角覆盖了一个按钮&#xff0c;点击edit(编辑) 3. 点击编辑后&#xff0c;出现弹窗&#xff0c;切换到color。color第一个是取色器&#xff0c;自己随意选择颜色。还有常用…

证件照的要求是什么?

1.证件照的要求是免冠(不戴帽子)正面照片&#xff0c;照片上正常应该看到人的两耳轮廓和相当于男士的喉结处的地方 2.照片尺寸可以为一寸或二寸&#xff0c;颜色可以为黑白或彩色&#xff0c;拍照时不得上唇膏等影响真实面貌的化妆色彩&#xff0c;包括头发的染色。 3.拍照时…

手机上怎么照证件照照片?教你两招轻松拍出证件照

怎么使用手机拍出证件照呢&#xff1f;证件照是我们在日常生活或者是工作中必备的一个证件&#xff0c;很多地方都会用得到&#xff0c;大家在照证件照的时候一般都会去照相馆拍摄&#xff0c;但是随着现在电子科技的进步&#xff0c;我们已经可以使用手机就能够拍出美美的证件…

​可以给证件照换衣服的软件有哪些?教你如何一键换装

有什么软件可以给证件照换衣服呢&#xff1f;证件照是我们大学毕业之后必备的一种证件&#xff0c;报名各种考试或者是找工作都是需要使用到的。但是大家在使用证件照的时候&#xff0c;往往会因为各种原因使我们的证件照不合规定&#xff0c;其中就有因为服装不够正式导致使用…

毕业生找工作必备技能——自己制作正装证件照

又到了毕业季&#xff0c;又是令人忙忙碌碌的找工作阶段&#xff0c;都说今年是毕业生找工作最难的一年&#xff0c;希望大家都能找到心仪的工作。找工作之前&#xff0c;大家简历所需的正装证件照都准备的怎么样了&#xff1f;是否必须跑一趟照相馆再照一张正装的照片呢&#…