github代码地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service

假设一个需求用户点击某个页面,我们后台需要向MQ推送信信息

1,模拟的MQ服务,我这边使用RabbitMQ (关于MQ 发送和监听消息可以参考我的博客:SpringBoot消息中间件RabbitMQ)

//后台监听消息    
@RabbitListener(queues = "brian.test")
public void receiveMessage(User user){
logger.info("接收到MQ的消息体: " + user);
}

2.向IOC容器中注册一个ThreadPoolTaskExecutor实例

    @Bean
public ThreadPoolTaskExecutor brianThreadPool(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数
executor.setCorePoolSize(8);
//最大线程数
executor.setMaxPoolSize(16);
//队列中最大的数
executor.setQueueCapacity(8);
//县城名称前缀
executor.setThreadNamePrefix("brianThreadPool_");
//rejectionPolicy:当pool已经达到max的时候,如何处理新任务
//callerRuns:不在新线程中执行任务,而是由调用者所在的线程来执行
//对拒绝task的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//线程空闲后最大的存活时间
executor.setKeepAliveSeconds(60);
//初始化加载
executor.initialize();
return executor;
}

3.实现线程池并发推送消息

    /**
* 多线程推送消息到MQ服务
*/
public void sendMessageByThredPool(User user) throws ExecutionException, InterruptedException {
Future<String> future = executor.submit(() -> {
sendMessageService.sendMessage("brian","mymq",user);
  logger.info("线程 [ " + Thread.currentThread().getName() + " ] 推送消息到MQ成功! " + new Date());
return Thread.currentThread().getName();
});
}

4. Controller层的调用

    @PostMapping("/loop/sendMsg/userInfo")
public ResponseEntity addUserInfo2MQ(@RequestBody User user) throws ExecutionException, InterruptedException {
brianService.sendMessageByThredPool(user);
return new ResponseEntity(user, HttpStatus.OK); }

5.利用postman 做压力测试,测试接口

5.1 postman做loop压力测试,需要单创建一个Collections来测试,并且当前Collections值允许放一个测试用例,比如我下面的loopSendUserInfo

5.2 设置测试规则

点击Preview ,可以预览测试数据

6.查看测试结果

6.1  rabbitmq

6.2 log中可以发现多个线程在推送消息

博客参考来源:1. 可取消的异步任务——FutureTask用法及解析

2. 多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture

JAVA多线程(四) Executor并发框架向RabbitMQ推送消息的更多相关文章

  1. JAVA调用易信接口向指定好友推送消息(二)POST测试

    易信的API接口做的还算简单 http://open.yixin.im/document/oauth/api 根据指南上的步骤,利用易信提供的测试ID AppID(client_id): yxbbd0 ...

  2. Java多线程(四) —— 线程并发库之Atomic

    一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下 ...

  3. JAVA调用易信接口向指定好友推送消息(一)背景需求

    众所周知,中国电信内部一直使用易信群进行交流 各种工作交流都在易信群里面沟通 包括投诉处理,障碍报修,拍照上传 最重要的就是每天甚至每个时点的指标完成情况的通报 所以只能用4个字来形容 String ...

  4. Java并发和多线程1:并发框架基本示例

    Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括ThreadPool,Executor,Executors,ExecutorService,Com ...

  5. java 多线程四

    java 多线程一 java 多线程二 java 多线程三 java 多线程四 一个生产者,消费者的例子: import java.util.Stack; /** * Created by root ...

  6. Java多线程专题1: 并发与并行的基础概念

    合集目录 Java多线程专题1: 并发与并行的基础概念 什么是多线程并发和并行? 并发: Concurrency 特指单核可以处理多任务, 这种机制主要实现于操作系统层面, 用于充分利用单CPU的性能 ...

  7. RabbitMQ消息队列安装和配置以及推送消息

    好久没有写了,最近项目用到RabbitMQ,找了一些资料试验,最后终于成功了,把安装配置的步骤分享给大家. 一.Erlang安装具体过程: 1.双击otp_win32_R16801.exe(不同版本可 ...

  8. ThinkPHP框架整合极光推送DEMO

    极光推送(JPush)是独立的第三方云推送平台,致力于为全球移动应用开发者提供专业.高效的移动消息推送服务. 本篇博文讲述如何在将极光推送DEMO整合到ThinkPHP框架中,我使用的是极光推送PHP ...

  9. Java端百度云推送消息Demo

    因为在做Java服务器有用到推送消息机制,于是到网上找了一下,就自己试着敲了一个demo.这个demo主要是简单的一个对app消息推送. jar:百度云消息推送Java端的jar. package x ...

随机推荐

  1. HDU2084_数塔【简单题】【数塔】

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  2. C#文件的压缩和解压(ZIP)使用DotNetZip封装类操作zip文件(创建/读取/更新)实例

    需要引用Ionic.Zip命名空间 DLL下载地址在这里:http://dotnetzip.codeplex.com/ 文件压缩 /// <summary> /// 压缩ZIP文件 /// ...

  3. maven插件介绍之maven-jar-plugin

    maven-jar-plugin 插件的maven依赖为: <dependency> <groupId>org.apache.maven.plugins</groupId ...

  4. chrome自带的调试工具

    由于项目需要加载webgl对浏览器内存压力很大,需要优化内存,网上找了一下资料,极力推荐chrome的开发文档 https://developers.google.cn/web/tools/chrom ...

  5. busybox 终端支持 ctrl-r

    Busybox Settings ---> Busybox Library Tuning ---> [*] History saving [ ] Save history on shell ...

  6. HTML页面中点击按钮关闭页面几种方式与取消

    1.不带任何提示关闭窗口的js代码 <input type="button" name="close" value="关闭" oncl ...

  7. 为什么java web项目中要使用spring

    1 不使用spring的理由 spring太复杂,不利于调试. spring太复杂,不利于全面掌控代码. spring加载bean太慢. 等等. 2 对不使用spring理由的辩驳 spring io ...

  8. mysql 免安装配置问题

    摘要: MySQL是一个小型关系型数据库管理系统,MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体 ...

  9. CSS3 (一)

    属性选择器 1. E[attr^="value"]:指定了属性名,并且有属性值,属性值是以value开头的: .wrap a[href^="http://"]{ ...

  10. RFC外部断点在在SAP退出后会失效

    rfc外部断点系统退出后会删除吗?  不会删除Rfc外部断点在在SAP退出后标识还在, 但是断点会失效! 附 断点消息: ABAP 中的断点分为静态和动态两种.一. 静态断点(Static Break ...