Java异步消息平台
l JAVA平台异步消息模块
JAVA平台异步消息模块,是一个针对RabbitMQ的消息发送及处理封装,包含消息的配置、发送、接收、失败重试、日志记录等,总共分为4个部分:
1)RabbitMQ访问封装:JAMQP(Jar包)
2)消息模块公共对象、配置读取及接口定义:JMSG(Jar包)
3)消息发送端:JMSG—Client(Jar包)
4)消息接收端:JMSG—Server(War包)
l RabbitMQ简介
MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是 AMQP的标准实现。
RabbitMQ的结构图如下:
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Alternate exchange:发送给某Exchange的消息路由失败时,发送至该exchange。
Dead letter exchange:死信Exchange,将超过一定时间的Queue中的消息发送至该exchange。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把Exchange和Queue按照路由规则绑定起来。
Routing Key:路由关键字,Exchange根据这个关键字进行消息投递。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
l RabbitMQ封装
1) RabbitConfig :所有RabbitMQ有关配置
2) RabbitConnectPool :RabbitMQ连接池,管理所有对RabbitMQ的连接
3) RabbitProxy :RabbitMQ连接的封装,包含
4) RabbitSendProxy : 专门用于发送消息的连接,继承自RabbitProxy
5) RabbitReceiveProxy :专门用于接收消息的连接,继承自RabbitProxy
6) RabbitReceiverDispatcher : 消息分发器管理类,用于消息的接
7) 消息发送:从连接池RabbitConnectPool中Get出RabbitSendProxy,调用send方法发送消息,return获得的RabbitSendProxy。发送失败的消息记录本地文件,由轮询线程获取消息后重试3次
8) 消息接收:服务启动时向RabbitReceiverDispatcher注册要监听的队列,每一个监听对应一个线程以及一个处理消息的线程池,从RabbitMQ获取到推送来的消息后,通过线程池并行处理
l 内部流程
n 消息发送逻辑
n 消息接收逻辑
l 配置说明
n RabbitMQ配置表
n 消息配置表
1) MessageName : 消息名称,MessageConfig表中唯一
2) Url : 消息的业务处理Http API地址
3) Priority : 消息优先级,必须写成P1,P2,P3....P8,P9,用于RabbitMQ的RouteKey,发送消息时的最终RouteKey = MessageName.Priority
l 使用方法
n 发送消息
消息发送方法定义:
/**
* 发送消息
* @param transferObject
* 消息主体对象
* @param customTag
* 自定义消息标签
* @param messageName
* 消息名称
*/
void send(Object transferObject, String customTag, String messageName);
在消息配置表中配置好消息的信息,引用JMSG和JMSG-Client 两个Jar包,调用方法如下:
public void SendMsg() {
RabbitMQSender sender = new RabbitMQSender();
sender.send(new Object(), "tag", "messageName");
}
注意:传输的对象(transferObject)进行JSON序列化后,大小不能超过64K,否则会抛出异常
n 接收消息
1) 实现一个能够接收Post请求的Http API,Post请求参数形式如下:
NameValuePair[] data = {
new NameValuePair("message", message.getTransferObjectJSON()),
new NameValuePair("messageName", message.getMessageName()),
new NameValuePair("tag", message.getCustomTag()),
};
2) 该API的返回值要求为JSON串,内容要求如下(responseCode:0表示处理成功,小于0表示系统异常,大于0表示业务异常):
"{exceptionMessgage:null, responseCode:0}"
3) 将该API的Url配置到MessageConsumersConfig表中
下面是一个简单的实例:
@Controller
public class ConsumerController {
private static final Logger logger = Logger.getLogger(ConsumerController.class);
@RequestMapping(value = "testmsgconsumer", method=RequestMethod.POST)
@ResponseBody
public String LogMessage(HttpServletRequest request) {
logger.info(request.getParameter("messageName") + "(" + request.getParameter("tag") + "): " + request.getParameter("message"));
return "{exceptionMessgage:null, responseCode:0}";
}
}
Java异步消息平台的更多相关文章
- java模拟异步消息的发送与回调
http://kt8668.iteye.com/blog/205739 本文的目的并不是介绍使用的什么技术,而是重点阐述其实现原理. 一. 异步和同步 讲通俗点,异步就是不需要等当前执行的动作完成 ...
- Java微信公众平台开发(三)--接收消息的分类及实体的创建
转自:http://www.cuiyongzhi.com/post/41.html 前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端post的消息类型,这里我们将建立消息实 ...
- NSQ:分布式的实时消息平台
NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版.NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其 ...
- Java微信公众平台开发之扫码支付模式一
官方文档点击查看准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败)借鉴了很多大神的文章,在此先谢过了大体过程:先扫码(还没有确定实际要支付的金额),这个码是商品的二维码,再生 ...
- JAVA记录-消息队列介绍
1.JMS概述 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消 ...
- 雅虎日本如何用 Pulsar 构建日均千亿的消息平台
雅虎日本是一家雅虎和软银合资的日本互联网公司,是日本最受欢迎的门户网站之一.雅虎日本的互联网服务在日本市场占主导地位. 下图从三个维度显示了雅虎日本的经营规模.第一个是服务数量,雅虎日本提供上百种互联 ...
- Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
- Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
Paip.Php Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1 异步调用的实现以及角色(:调用者 提货单) F ...
- C# socket 实现消息中心向消息平台 转发消息 (修改)
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...
随机推荐
- Android--ViewPager的无限轮播
ViewPage_RadioButton实现带小圆点的无限轮播,效果还能凑合着用. 1.在ViewPage的监听里面这样处理 @Override public void onPageSelected( ...
- 无法在 Android 模拟器上访问本机的Web服务的解决办法
我在本地跑了一个 Tomcat ,我想在 Android 模拟器中直接通过下面的 url 地址访问 Tomcat 上的服务 http://192.168.0.20:8080/getweather 但是 ...
- oracle12c不能进入到http://localhost:5500/em的解决办法
Oracle11g企业管理器无法打开——解决https://localhost:1158/em 页面无法打开的问题 常见的问题:https://localhost:1158/em 无法打开 解决办法: ...
- 实体框架 (EF) 入门 => 六、性能注意事项
这个还真是复杂,看了看微软的文档,有些根本就看不懂,有些能看懂,但对我这种菜鸟也不会去用. 无从下手啊,前面放了几个链接,挨个试试吧. 一.显式打开连接 这个我测试过,有些时候,需要我们显示打开连接, ...
- iOS 进阶 第十四天(0416)
0416 注意调用关系,如下图: 就是initWithCoder:.initWithFrame.setup方法三元组
- C++ vector介绍
<span style="font-family: Arial; ">在此总结一下模板vector的使用介绍</span> 标准库vector类型使用需要的 ...
- Log4Net学习【二】
Log4Net结构详解 当我们在描述为系统做日志这个动作的时候,实际上描述了3个点:做日志,其实就是在规定,在什么地方 用什么日志记录器 以什么样的格式做日志.把三个最重要的点抽取出来,即什么地方,日 ...
- Java小应用程序
Java小应用程序: package applet; import java.applet.AudioClip; import java.awt.BorderLayout; import java ...
- svn 检出 Check out 请求的名称有效,但是找不到请求的类型的数据。
根据问题不同有不同的解决方案,可按照以下方法进行解决1.取消TortoiseSVN-网络-代理2.确认SVN目录地址是否正确,可在浏览器中直接打开测试.如地址是由计算机名组成请改成Ip地址进行测试
- aspose.cell 自定义模板 SUM无效
数字类型的单元格, 显示 解决方案: 绑定的DataTable的列为字符串类型. 应该将其设置成数字类型的列