# message-trunk **Repository Path**: lzrd-java/message-trunk ## Basic Information - **Project Name**: message-trunk - **Description**: message-trunk是以redis为基础搭建的轻量级消息总线(队列),和主流MQ相比使用起来更灵巧简便。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 102 - **Created**: 2017-03-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # message-trunk ==================== ![License](https://img.shields.io/cocoapods/l/TWPhotoPicker.svg) ![Platform](https://img.shields.io/badge/platform-java-yellow.svg) > **message-trunk**是基于java开发的轻量级消息总线框架。 框架开发宗旨:项目内的轻量级消息队列。 框架开发目的:在项目内部,我们常常需要做异步操作,常规的做法是提交给线程池去做,这样会导致一些: * 线程池大小不可控,任务可能因为线程池满了被抛弃。 * 任务执行失败没有重试机制。 * 任务执行失败没有统一的异常处理。 为了解决如上问题,基于redis的队列开发了该消息队列,具有如下特点: * 足够轻量级,队列配置简单,只要使用redis即可,不需要额外部署环境; * 支持分布式,任务提交后由多台机器分布式处理,机器资源分配合理; * 处理效率高,任务交给多线程并发处理; * 处理有重试机制,并且可自定义错误处理。 * 对于小型数据入队列,出队列效率高。 ## Installation 如何使用该框架? 上传至maven中央仓库还在操作中,可以下载代码,其中有使用demo,你可以自由的修改代码,做任何你需要的定制。 ## DEMO 运行mt-demo,打开index.jsp运行测试例子。演示地址: 简单测试:http://123.206.202.189:8080/mt-demo/index.jsp 性能测试:http://123.206.202.189:8080/mt-demo/index-preformance.jsp ## Requirements * java 6.0+ ## License message-trunk is available under the Apache license, see the LICENSE file for more information. ## 使用指南 ### 1.消息入队列 获取消息队列全局对象MessageTrunk(可以用spring注入),put入消息即可。 ``` // 获取MessageTrunk实例 MessageTrunk mt = (MessageTrunk) SpringBeanUtils.getBean("messageTrunk"); Message message = new Message(MessageType.DEMO_MESSAGE, new DemoMessage(value)); // 消息入MT mt.put(message); ``` ### 2. 处理消息 消息处理器:继承AbstarctMessageHandler抽象类。 ``` public class DemoHandler extends AbstarctMessageHandler { private static Log logger = LogFactory.getLog(DemoHandler.class); public DemoHandler() { // 说明该handler监控的消息类型 super(MessageType.DEMO_MESSAGE); } /** * 监听到消息后处理方法 */ @Override public void handle(DemoMessage message) { // do handle } @Override public void handleFailed(DemoMessage obj) { // handle failed } } ``` ## 实现原理 基本原理是redis的阻塞取命令: Blpop,该命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 ## 性能测试([测试链接][1]) 理论上,队列的出入速度和redis的rpush和lpop相当,可以达到14000+次请求每秒。实际用4核i5+16GB机器,单线程去推入最高达到5820+次请求每秒。 如下为测试: ``` 控制台: 2017-03-14 0:5:54:991 连接控制台成功 2017-03-14 0:6:5:706 开始插入消息到MT(PS:单线程推入1000个消息) 2017-03-14 0:6:6:95 结束插入消息到MT,一共耗时:388 2017-03-14 0:6:11:687 开始插入消息到MT(PS:单线程推入10000个消息) 2017-03-14 0:6:13:761 结束插入消息到MT,一共耗时:2076 2017-03-14 0:6:19:736 开始插入消息到MT(PS:单线程推入100000个消息) 2017-03-14 0:6:36:532 结束插入消息到MT,一共耗时:16797 2017-03-14 0:7:11:753 开始插入消息到MT(PS:单线程推入500000个消息) 2017-03-14 0:8:45:626 结束插入消息到MT,一共耗时:93873 2017-03-14 0:12:32:355 开始插入消息到MT(PS:单线程推入1000000个消息) 2017-03-14 0:15:23:828 结束插入消息到MT,一共耗时:171472 ``` [1]: http://123.206.202.189:8080/mt-demo/index-preformance.jsp