前端消息通讯 centrifugoService
event.m 剖析
event.m 是事件模型的一种定义形式,采用 Xml 格式进行描述,格式如下。
<events filepath="service/main/alarmGroup.events.m">
<label language="zh_CN">预警事件组</label>
<event
xmlns="http://www.justep.com/model" name="danger">
<label language="zh_CN">危险</label>
<data dataType="AlarmHandle"/>
<prop label="报警编码" name="alarmCode" dataType="String" required="true" isTopic="true"/>
</event>
</events>
说明:
- events:是描述事件组,里面可嵌套多个事件 event,事件组名即是该事件模型文件名,如上示例可得事件组名为 alarmGroup。
- event:事件本身的定义,包含事件名、事件数据的格式类型,和属性的定义。
- 属性 prop :定义事件数据类型中的某个字段属性,方便前端过滤接收。
centrifugoService 提供的几个接口
了解后用于推送消息到前端
获取通道
GET /centrifugohelper/centrifugo/getchannel
参数
参数名 | 参数说明 | 类型/必填 | 备注 |
---|---|---|---|
serviceName | 服务 | Param、String、可选 | 和 moduleName 拼接组合形成 svc,组顺序是 serviceName\\moduleName |
moduleName | 模块名 | Param、String、可选 | 和 serviceName拼接组合形成 svc,组顺序是 serviceName\\moduleName |
svc | 服务地址 | Param、String、可选 | 如果存在将优先使用svc 如果不存在则使用 serviceName\\moduleName |
eventGroup | 事件分组 | Param、String、必填 | |
event | 事件 | Param、String、可选 | |
property | 属性 | Param、String、可选 |
// 返回:
{
"success": true,
"msg": "获取通道成功",
"data": "\\main\\alarmGroup\\danger\\alarmCode"
}
消息推送
POST /centrifugohelper/centrifugo/publish
// body
{
"channels": ["\\serviceName\\moduleName\\eventGroup\\event\\property", "通道1"],
"data": ["内容1", "内容2"],
"subject": "主题(没有特殊性,这里一般与channel一致)",
"source": "服务源头",
"option": {
"anonymous": true
}
}
精简消息推送
POST /centrifugohelper/centrifugo/simplepublish
该接口一般可以与 eventBridge trigger 配合使用,解决后端事件直接推送到前端的场景。
// body
{
"channels": "\\serviceName\\moduleName\\eventGroup\\event\\property",
"data": "内容",
"subject": "主题(没有特殊性,这里一般与channel一致)",
"source": "服务源头",
"option": {
"anonymous": true
}
}
使用示例
定义自己的事件模型 event.m
添加订阅组件 wxSubscribe 并进行配置
添加事件订阅移动组件
拖入页面配置使用
onWxSubscribe0Message = (event) => {
var msgValue = event.message.data[0];
if(msgValue){
console.info("接收到消息——》" + msgValue)
}
}
往 centrifugo 服务端发送消息
// 简单测试
1.获取通道
curl http://entry.newdao-tenant-chensc1/eventing/centrifugohelper/centrifugo/getchannel?svc=main&eventGroup=alarmGroup&event=danger
2.发送消息
curl -X POST -H "Content-Type: application/json" \
-d {"channels":["\\\\serviceName\\moduleName\\eventGroup\\event\\property","通道1"],"data":["内容1","内容2"],"subject":"主题(没有特殊性,这里一般与channel一致吧)","source":"服务源头","option":{"anonymous":true}} \
http://entry.newdao-tenant-chensc1/eventing/centrifugohelper/centrifugo/publish
// 通过封装好的 java SDK 代码编写
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.justep.clients.eventing.CentrifugoClient;
import com.justep.clients.eventing.api.CentrifugoApi;
import com.justep.clients.eventing.vo.MessageData;
import java.util.ArrayList;
import java.util.List;
public class CentrifugoTest {
public void send(){
String svc = "main";
String eventGroup = "alarmGroup";
String event = "danger";
CentrifugoApi centrifugoApi = CentrifugoClient.getInstance();
String channelStr = centrifugoApi.getChannel(null, null, svc, eventGroup, event, null);
JSONObject channelObj = JSON.parseObject(channelStr);
String channel = channelObj.getString("data").getString("channel");
List<String> channels = new ArrayList<>();
channels.add(channel);
List<String> datas = new ArrayList<>();
datas.add("你刚刚吃饭了吗");
MessageData<String> messageData = MessageData.<String>builder()
.channel(channels)
.source("alarmService")
.subject(channel)
.option(MessageData.Option.build()) // Option默认使用匿名方式,如要自定义,可自行定义属性
.data(datas)
.build();
centrifugoApi.publish(messageData);
}
}
通过 trigger 直接对接前端
// 下面的配置主要是发送到centrifugo转接到前端
[{
"id": "ce985329-d8f4-4c6c-9f4e-fgffg1334",
"event": "mqtt:topic",
"describe": "mqtt直发web前端",
"target": {
"request": [{
//第一个请求先get获取centrifugo的通道
"method": "GET",
"url": "service://eventing/centrifugohelper/centrifugo/getchannel?serviceName=serviceNamexxx&moduleName=moduleNamexxx&eventGroup=eventGroupxxx&event=eventxxx"
}, {
"method": "POST",
"url": "service://eventing/centrifugohelper/centrifugo/simplepublish",
"body": {
// 使用JSONPath能够获取第一个请求得到channel
"channels": "${$.data.channel}",
// 根据事件中心cloudEvent的特性可以拿到data JSON的值
"data": "${<cloudEvent>$.data}|json",
// 根据事件中心cloudEvent的特性可以拿到subject的值
"subject": "${<cloudEvent>$.subject}",
// 可填服务名,用于centrifugo中问题追踪
"source": "serviceNamexxx",
"option": {
"anonymous": true
}
}
}],
"timeoutSeconds": 100
}
}]