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