Java异步消息平台

JAVA平台异步消息模块

JAVA平台异步消息模块,是一个针对RabbitMQ的消息发送及处理封装,包含消息的配置、发送、接收、失败重试、日志记录等,总共分为4个部分:

1)RabbitMQ访问封装:JAMQP(Jar包)

2)消息模块公共对象、配置读取及接口定义:JMSG(Jar包)

3)消息发送端:JMSG—Client(Jar包)

4)消息接收端:JMSG—Server(War包)

 

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代表一个会话任务。

 

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获取到推送来的消息后,通过线程池并行处理

 

内部流程

消息发送逻辑

 

消息接收逻辑

 

 

 

配置说明

RabbitMQ配置表

 

 

消息配置表

 

1) MessageName : 消息名称,MessageConfig表中唯一

2) Url : 消息的业务处理Http API地址

3) Priority : 消息优先级,必须写成P1,P2,P3....P8,P9,用于RabbitMQ的RouteKey,发送消息时的最终RouteKey = MessageName.Priority

 

使用方法

发送消息

消息发送方法定义:

    /**

     * 发送消息

     * @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,否则会抛出异常

接收消息

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}";

      }

   }

 

 
 
 
 
posted @ 2015-08-27 10:08  积淀  阅读(1053)  评论(0编辑  收藏  举报