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());
}
}
````