点击关注公众号,实用技术文章及时了解

来源:blog.csdn.net/qq_37936542/

article/details/82012991

问题描述:项目中接收到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){}
}

推荐:

主流Java进阶技术(学习资料分享)

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

如何用多线程方式,提高rabbitmq消息处理效率?相关推荐

  1. 如何用人机协同提高客服效率?阿里巴巴客服助手诞生了

    <如何用人机协同提高客服效率?阿里巴巴客服助手诞生了> 阿里巴巴经济体每天都在服务着数以亿计的会员,每天会员求助的进线量巨大,尽管机器人的解决能力已经很强大,但是以目前技术人工客服依然无法 ...

  2. 通过多线程压缩提高生成 Zip 文件的效率

    在很多情况下,需要用 Zip 格式保存数据文档.当数据量较大时(超过100M),就会明显感觉到保存文件耗时很长(超过10秒),这样的用户体验难以接受,想要优化. 现有开源方案 zlib-ng/zlib ...

  3. linux bash 效率,提高Linux工作效率的十大bash技巧

    原标题:提高Linux工作效率的十大bash技巧 " 希望我的这些追求最大化命令行效率的努力成果也能给其他喜欢使用bash的朋友们带来一些帮助. 我喜欢钻研bash环境.很多时候,在使用ba ...

  4. 使用Python,OpenCV线程化方式提高视频FPS(每秒帧数)

    使用Python,OpenCV处理视频流时,获得更高FPS(Frams Per Second)的"秘密"是将I / O(即从摄像机传感器读取帧)交给线程去处理: 读取帧 I/O是阻 ...

  5. AI提高药物发现效率 | ML,Supercomputers and Big Data

    摘要 药物研发成本的增加和投资回报率的降低对制药行业构成了巨大的威胁.新兴技术有可能大幅提高药物研发和制造的效率.人工智能(AI)被认为是一种令人难以置信的工具,可以增强医疗保健的多个方面,特别是药物 ...

  6. 客户管理系统代码项目_西安人力资源管理系统如何有效管理销售,提高工作的效率...

    人力资源管理系统如何有效管理销售,提高工作的效率 发布人:汇聚华企管理系统 原创分享 销售过程会出现的管理问题各种各样,比如说库存状态,比如说报价,又比如说客户关系管理,其实这些管理上的问题都能用软件 ...

  7. 提高oracle查询效率

    转载自: http://zhidao.baidu.com/link?url=E_HaRWGF3wCYYKG1l-qg5pNmjsePoH3wo_81Zpf5GaytfIW869RhWTIR6_jGPh ...

  8. 提高sqlmap爆破效率

     提高sqlmap爆破效率 sqlmap在注入成功后,会尝试获取数据库和表的结构.对于MSSQL.MySQL.SQLite之类数据库,sqlmap可以通过系统数据库.系统数据表获取数据库和表的结构.但 ...

  9. EZ430 Chronos 如何提高开发调试效率探讨

    2019独角兽企业重金招聘Python工程师标准>>> EZ430 Chronos 如何提高开发调试效率探讨 TI的 EZ430 Chronos 开发套件在调试程序时需要把手表拆开, ...

最新文章

  1. Sharepoint学习笔记—ECMAScript对象模型系列-- 9、组与用户操作(二)
  2. 软件版本命名规范(转载)
  3. 世界上第一位程序员是位美女——AdaLovelace【有图为证】
  4. C# 往excel出力数据
  5. xshell 安装yum_xshell上安装docker
  6. QTcpServer / QTcpSocket 简单示例
  7. Docker——基于HubServing部署全套PaddleOCR Restful API服务(CPU版本)
  8. [翻译]Triggerless design.md
  9. 优必选能开放软硬件源代码吗_开放式硬件为何胜出
  10. 用好CloudIDE提升Web全栈编码效率
  11. 陶瓷天线和PCB天线以及IPEX天线三者间区别
  12. Couldn't find leader offsets for Set news_topic
  13. UNCODE 与 ANSI 编码互相转换
  14. Wordpress中wp-admim管理后台(404)无法进入,无限循环跳出解决方法
  15. excel模板报表转PDF下载
  16. Rational License Key Error的永久解决办法
  17. Unable to import maven project: See logs for details
  18. Machine Learning读书会,面试算法讲座,创业活动,算法班(历届汇总)
  19. idea启动报错:Failed to create JVM. JVM Path: D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.3\jbr\
  20. 论:程序员成就之天梯排行榜

热门文章

  1. 双11 iPhone再降价:24期免息 四舍五入等于不要钱!
  2. 因误推送“台风致全省人死亡”消息 腾讯视频push线团队全部被开?回应...
  3. 明星分手文案火了!为了营销 你们这些商家也是很努力啊...
  4. 华为今年或发两款5G产品:5G CPE Win和5G随行WiFi
  5. 阿里之后 “安卓终结者”来了!
  6. 华为鲁勇:华为5G专利数量全球第一 比美国所有企业还多
  7. 拼多多开始卖车了!3.49万秒杀五菱宏光...
  8. 2019支付宝集五福高阶玩法 助你快速集齐五福
  9. Android 完整漂亮问卷、试卷 -- 支持单选、判断、不定项
  10. syslog-ng配置说明