Java服务器端消息队列实战
服务端口监听--报文接收--报文解码--业务处理--报文编码--写回客户端
从服务端与客户端成功握手并产生一个socket后,为了提高吞吐能力,接下来的事情就可以交给多线程去处理。
为了对接入的请求做合理的限制、控制,引入消息队列缓冲技术。
队列,主动推送消息和被动拉取消息两种方式实现,并且可以在两种实现上增加自定义的策略,例如:流量控制等。
接下来将使用Java语言实现队列与多线程整合技术的实现。
这里直接使用LinkedBlockingQueue队列,自带队列阻塞功能,免去线程安全控制。
package hope.queue.blockdemo; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
/**
* 消息队列缓冲定义
* @author hp
*
*/
public class PushBlockQueue extends LinkedBlockingQueue<Object>{ private static final long serialVersionUID = -8224792866430647454L;
private static ExecutorService es = Executors.newFixedThreadPool(10);//线程池
private static PushBlockQueue pbq = new PushBlockQueue();//单例
private boolean flag = false; private PushBlockQueue(){} public static PushBlockQueue getInstance(){
return pbq;
} /**
* 队列监听启动
*/
public void start(){
if(!this.flag){
this.flag = true;
}else{
throw new IllegalArgumentException("队列已处于启动状态,不允许重复启动.");
}
new Thread(new Runnable(){
@Override
public void run() {
while(flag){
try {
Object obj = take();//使用阻塞模式获取队列消息
//将获取消息交由线程池处理
es.execute(new PushBlockQueueHandler(obj));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); } /**
* 停止队列监听
*/
public void stop(){
this.flag = false;
}
}
定义队列处理器,这个处理器实现Runnable接口,是为了与线程池做衔接。
package hope.queue.blockdemo;
/**
* 队列消息处理实现
* @author hp
*
*/
public class PushBlockQueueHandler implements Runnable { private Object obj;
public PushBlockQueueHandler(Object obj){
this.obj = obj;
} @Override
public void run() {
doBusiness();
} /**
* 业务处理时限
*/
public void doBusiness(){
System.out.println(" 处理请求 "+obj );
} }
测试实例
package hope.queue.blockdemo;
public class AppTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
PushBlockQueue.getInstance().start();
for(;;){
Thread.sleep(1000);
PushBlockQueue.getInstance().put("0123456");
}
}
}
输出结果
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
处理请求 0123456
这种模式可以应用到很多场景,希望对大家工作上有所帮助。
Java服务器端消息队列实战的更多相关文章
- JAVA记录-消息队列介绍
1.JMS概述 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消 ...
- LINUX消息队列实战之一
前言 能说能抄能论皆不算,能写能打才是真功夫. 唠叨 反正我也是一个孤独的程序猿,多说一些奇奇怪怪的唠叨也无妨,第一次写消息队列,书本的东西和实战很不同,根据实战总结的一些注意事项会和大家分享,也敲打 ...
- java JMS消息队列
http://blog.csdn.net/shirdrn/article/details/6362792 http://haohaoxuexi.iteye.com/blog/1893038 http: ...
- java学习-消息队列rabbitmq的组成
rabbitMQ组成部分 rabbitmq有以下组成部分,分别为: 1. Server(broker)接受客户端连接,实现AMQP消息队列和路由功能的进程 2.虚拟主机virtual host虚拟主机 ...
- java之消息队列ActiveMQ实践
原创论文:https://www.cnblogs.com/goujh/p/8510239.html 消息队列的应用场景: 消息队列应用场景 异步处理,应用解耦,流量削锋和消息通讯四个场景 异步处理: ...
- Java面试—消息队列
消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得. 题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一 ...
- Java基础——消息队列
1.消息队列的适用场景:商品秒杀.系统解耦.日志记录等 2.使用Queue实现消息对列 双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取阻塞队列指 ...
- [Java] 分布式消息队列(MQ)
概述 场景 服务解耦 削峰填谷 异步化缓冲:最终一致性/柔性事务 MQ应用思考点 生产端可靠性投递 消费端幂等:消息只能消费一次 高可用.低延迟.可靠性 消息堆积能力 可扩展性 业界主流MQ Acti ...
- 【LiteOS】LiteOS消息队列-实战
目录 前言 链接 参考 笔录草稿 创建测试任务 部分源码 前言 链接 LiteOS源码链接 常见问题 华为开发者社区 华为LiteOS官方教程 我的gitee-LiteOS-mcu 参考 上面链接 笔 ...
随机推荐
- 转 Ubuntu 下 vim 搭建python 环境 配置
1. 安装完整的vim# apt-get install vim-gnome 2. 安装ctags,ctags用于支持taglist,必需!# apt-get install ctags 3. 安装t ...
- struts2之输入验证
输入校验主要分为两种: 基于客户端的校验: 客户端校验主要作用是防止正常浏览者的误输入,仅能对输入进行初步过滤:对于一些用户恶意行为,客户端校验则无能为力. 基于服务端的校验: 服务器接收客户端提交的 ...
- MySQL字段属性介绍
引言 这次Qi号分享MySQL字段属性简介.下面资料是Qi号搜集大量资料与个人理解的整理. MySQL提供了一组可以赋给表中各个列的数据类型,每个类型都强制数据满足为该数据类型预先确定的一组规则,例如 ...
- 裸机——iNand
1.先晓得iNand的基础知识 iNand是在SD卡基础上发展来的,而SD卡是在MMC的基础上发展来的,MMC是在Nand的基础上发展来的 我们晓得Nand的基础知识,而MMC对Nand大致做了两个改 ...
- BurpSuite 的使用
最好用的抓包软件, 不只是抓包软件 IE/Chrome中设置代理的方法是, 打开Internet选项面板->连接->局域网设置->取消勾选的使用自动配置脚本->勾选为LAN使用 ...
- Hive数据导入导出的n种方式
Tutorial-LoadingData Hive加载数据的6种方式 #格式 load data [local] inpath '/op/datas/xxx.txt' [overwrite] into ...
- 利用split方法计算字符串中出现字母最多的次数
最近练习一些简单的算法题,知道自己很不聪明,但却没想到用了这么久,划算不划算是个需要考虑的问题, 其中有个算法是:统计一个字符串出现最多的字母,网上很多自己的见解,但是才疏学浅,有些地方看的有点困难, ...
- java.math.BigDecimal cannot be cast to java.lang.String解决方法
从mysql数据库里取decimal(18,2)封装到Map<String,String>中 BigDecimal b = new BigDecimal(resultMap.get(&qu ...
- 《Cracking the Coding Interview》——第11章:排序和搜索——题目2
2014-03-21 20:49 题目:设计一种排序算法,使得anagram排在一起. 解法:自定义一个comparator,使用额外的空间来统计字母个数,然后比较字母个数. 代码: // 11.2 ...
- 每天一个Linux命令(9):cp命令
cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文 ...