java 多线程推送消息_JAVA多线程(四) Executor并发框架向RabbitMQ推送消息

假设一个需求用户点击某个页面,我们后台需要向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 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

9d8405371f024919e2c098c6b63ce1e4.png

5.2 设置测试规则

7fa0d2aa69941856ef2a5e897929102d.png

cd5816c6cf8fee8a386811e63123ef30.png

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

4bf1175531281dcda65e27c324008e8b.png

6.查看测试结果

6.1  rabbitmq

70ed090cc85c4e65e90f162b1934536a.png

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

4d1dfa421ea8c4550dceefe0ffd6f54f.png

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

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

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

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

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

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

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

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

java 多线程四

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

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

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

ThinkPHP框架整合极光推送DEMO

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

Java端百度云推送消息Demo

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

Websocket实现Java后台主动推送消息到前台

写在前面 需求: 项目测试, 缺少用户登录失败给admin推送消息, 想到这个方式, 当用户登录失败时, admin用户会在页面看到咣咣乱弹的alert. 正文 pom.xml


版权声明:本文为weixin_28719225原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。