MQ在domain中的快速使用
网市场云建站系统分为几个模块
网站管理后台,也就是 com.xnx3.wangmarket.admin 包
代理后台,也就是 com.xnx3.wangmarket.agency 包
总管理后台,也就是 com.xnx3.wangmarket.superadmin 包
还有一个网站做好后,访客访问网站的,便是 com.xnx3.wangmarket.domain 包
其中,网站访问的 domain 包,是可以拿出来单独进行分部署部署的。
比如在网站管理后台,更改域名,那么更改完成后,需要将最新更改的域名通知到 domain ,就需要使用MQ进行通知。
这里以 cnzz 插件为例说明。
cnzz插件源码: https://gitee.com/leimingyun/wangmarket_plugin_cnzz
当在网站管理后台启用cnzz统计功能后,用户访问网站,就会进行统计。反之,如果用户不启用cnzz统计功能,那么用户访问网站时不会进行统计。
## 1. 在网站管理后台发送改动通知
网站管理后台进行改动,比如将其改为进行统计,那么需要通知到 domain ,如果用户访问的是这个网站,那么你要进行统计访问用户。也就是要在所有html页面中多加一个js,用这个js来进行统计
Controller 中需要做的,有改动后,发送一条消息,到 MQ
````
//实体类中将 isUse 变为开启统计功能,保存入数据表。
cnzz = new Cnzz();
cnzz.setSiteid(site.getId());
cnzz.setIsUse(1);
向数据表中保存cnzz实体类.....就不写了,上面这几行代码是次要的,下面这一样是主要的
//将这个最新的实体类的数据,发送到mq
com.xnx3.wangmarket.domain.mq.DomainMQ.send("cnzz", new com.xnx3.wangmarket.domain.bean.PluginMQ(com.xnx3.wangmarket.admin.util.SessionUtil.getSite()).jsonAppend(net.sf.json.JSONObject.fromObject(com.xnx3.j2ee.util.EntityUtil.entityToMap(cnzz))).toString());
````
#### 解释
com.xnx3.wangmarket.admin.util.SessionUtil.getSite() 从缓存中获取当前登录的网站信息
com.xnx3.j2ee.util.EntityUtil.entityToMap(...) 将实体类转化为Map的格式
net.sf.json.JSONObject.fromObject(...) 将对象转化为 json 格式
com.xnx3.wangmarket.domain.mq.DomainMQ.send("cnzz", ...) 其中第一个参数,cnzz在,是插件的id,也就是插件在 com.xnx3.wangmarket.plugin 包中的名字,插件叫什么,这里就填什么。
这个 DomainMQ.send(...) 里面只需要将两处修改为你自己的即可,
1. 一个是 send('cnzz',...) 这第一个参数 cnzz,变成你自己的插件id,
1. 第二个是 EntityUtil.entityToMap(cnzz) 这个cnzz实体类,换成你自己的,想要发送的信息,又或者你不想将实体类信息发送,而是自由组合其他信息,你可以在 JSONObject.fromObject(...) 中不发送这个实体类,而是创建一个 HashMap 进行发送。想要发什么内容,你就在map里塞上什么即可。
## 在 domain 项目中,接收发过来的 MQ 消息
随着访问量越来越大,domain服务器可能是多台的。也就需要用MQ进行通信是很有必要了
创建一个 Plugin.java ,来接受MQ消息,将接收到的MQ数据,载入持久缓存。如下代码
````
package com.xnx3.wangmarket.plugin.cnzz;
public class Plugin implements com.xnx3.wangmarket.domain.pluginManage.interfaces.CreateReceiveMQInterface{
@Override
public void createReceiveMQForDomain() {
}
}
````
如此,便自动接收到第一步中 DomainMQ.send("cnzz",...) 发送过来的消息了。
#### 注意点
1. 要实现接口 com.xnx3.wangmarket.domain.pluginManage.interfaces.CreateReceiveMQInterface
2. 实现接口的 createReceiveMQForDomain() 方法
3. 这个 Plugin.java 这个类要在 package com.xnx3.wangmarket.plugin.cnzz 这个包下,才会自动识别出要接收 cnzz 这个插件的mq通知。也就是这个类放到哪个插件的包下,就会接收哪个插件的MQ通知
## domain 项目中,接收到了通知,要怎么从缓存中将信息取出来
使用 PluginCache 获取MQ的数据
````
Map map = com.xnx3.wangmarket.domain.util.PluginCache.getPluginMap(siteid, "cnzz");
````
PluginCache.getPluginMap 有两个参数
1. siteid 也就是站点id,要取的数据是属于哪个站点的
1. cnzz 这个也就是插件的id,要取的数据,属于哪个站点下,哪个插件的
而取到的数据,便是 Map 格式。
通常,MQ 插件都是跟 DomainVisitInterface 网站访问拦截的接口一起使用的
## domain 中mq通知的具体使用
````
package com.xnx3.wangmarket.plugin.cnzz_domain;
import java.util.Map;
import com.xnx3.wangmarket.admin.pluginManage.interfaces.AutoLoadSimpleSitePluginTableDateInterface;
import com.xnx3.wangmarket.domain.bean.RequestInfo;
import com.xnx3.wangmarket.domain.bean.SimpleSite;
import com.xnx3.wangmarket.domain.pluginManage.interfaces.CreateReceiveMQInterface;
import com.xnx3.wangmarket.domain.pluginManage.interfaces.DomainVisitInterface;
import com.xnx3.wangmarket.domain.util.PluginCache;
/**
* CNZZ统计
* cnzz管理后台:https://web.umeng.com/main.php?c=site&a=show
* @author 管雷鸣
*
*/
public class Plugin implements DomainVisitInterface, CreateReceiveMQInterface{
//放在网页上面的js代码。其中 {id} 会自动替换为 cnzz 站点的id
public static final String JS = "";
public String htmlManage(String html, SimpleSite simpleSite, RequestInfo requestInfo) {
Map map = PluginCache.getPluginMap(simpleSite.getSiteid(), "cnzz");
if(map == null){
//为空,则是没有使用到该插件,将html 原样返回
return html;
}
if(map.get("is_use") != null && map.get("is_use").toString().equals("1")){
//如果当前网站启用了插件,那么就要向html末尾追加js
Object cnzzSiteid = map.get("cnzz_siteid");
if(cnzzSiteid != null){
String js = JS.replaceAll("\{id\}", cnzzSiteid.toString());
html = html + js;
}
}
return html;
}
@Override
public void createReceiveMQForDomain() {
}
}
````