前端消息通讯 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

Alt text

添加订阅组件 wxSubscribe 并进行配置

添加事件订阅移动组件

Alt text

拖入页面配置使用

Alt text

Alt text

    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
    }
}]

results matching ""

    No results matching ""