MQ 的使用

## 简介 MQ工具类: > com.xnx3.j2ee.util.MQUtil 其中核心的两个方法: #### MQUtil.send(.......) 推送消息到MQ服务器,让MQ服务器来通知其他所有实现过MQUtil.receive的项目。 #### MQUtil.receive(......) 接收MQ服务器推送过来的消息响应,进行处理。 ## 有两种MQ推送的方式 ## RabbitMQ 使用 rabbitmq 的配置,在 application.properties 文件中的 spring.rabbitmq.host 等,当配置好了这些,MQUtil 就是以 rabbitmq 进行消息推送。 此种消息接收处理,是异步的。其中 RabbitMQ 服务器搭建,可以参考 http://help.wscso.com/6924.html 此种方式适合 项目分布式部署。单机项目多数情况下应该用不到,考虑用下面的JavaMQ,会更省事,更省钱。 ## JavaMQ 文件 application.properties 中 spring.rabbitmq.host 等 spring.rabbitmq. 开头的,都注释掉,便不使用 rabbitmq ,而是使用的 JavaMQ (管雷鸣写的一个模拟MQ收发消息,于是自己命名的)网市场云建站系统中,默认便是此种方式。 再一个项目中,如果项目前期单机的,后续有可能会用分布式,但是前期很长一段时间都是单机的,但又想有mq功能,以便到时候方便的扩展分布式,那么JavaMQ可以无缝变为RabbitMQ,就只是配置一下 application.properties 而已。 JavaMQ(Java模拟的MQ),消息接收处理,是同步的,是同一个线程执行。消息接收处理的过程是会阻断主线程的。 ## 代码实现示例 创建一个 Controller 进行测试 ```` package com.xnx3; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.xnx3.DateUtil; import com.xnx3.j2ee.util.MQUtil; import com.xnx3.j2ee.util.mq.MQReceive; import com.xnx3.json.JSONUtil; import net.sf.json.JSONObject; /** * 演示 rabbitmq 的使用 * @author 管雷鸣 * */ @Controller @RequestMapping("/") public class TestController{ /* * 可以理解为一个通道的名字,MQ发送消息时,会将消息发送到这个通道中,而其他所有的实现了 MQUtil.receive() 的,都会接收到消息 */ public static String pluginId = "test"; static{ /* * 这个整个项目只需要运行一次,也就是创建一次即可,如果你创建两次,那么MQ服务器将消息分发的时候,你就会执行两次。 * 同理,你可以在每个服务器的项目中,这样创建一次,那么MQ服务器收到消息后,就会分发到所有实现了这个方法的服务器上,将信息通知推送到各个服务器上 */ MQUtil.receive(pluginId, new MQReceive() { @Override public void receive(String content) { System.out.println("接收到了MQ服务器分发的消息,content:"+content); //使用时,可以将这个字符串转化为json使用 JSONObject json = JSONObject.fromObject(content); System.out.println("姓名 :"+JSONUtil.getString(json, "username")); } }); } /** * 每当访问这个网址 /test.do 便会往mq服务器发送消息 */ @RequestMapping("test${url.suffix}") public void test(HttpServletRequest request,Model model){ //模拟创建一个数据对象 Map map = new HashMap(); map.put("username", "管雷鸣"); map.put("site", "www.guanleiming.com"); map.put("time", DateUtil.timeForUnix10()); //将创建的数据对象转化为json字符串的形式,发送给MQ服务器,然后MQ服务器在对其他所有绑定(也就是实现过 MQUtil.receive 方法)的服务器进行分发 MQUtil.send(pluginId, JSONObject.fromObject(map).toString()); } } ````