Socket.D v2.5.12

语义消息(或元信息标注)

</> markdown

语义的基础,是通过元信息进行描述。http 之所以有丰富多彩的应用,便是有元信息支持。

1、元信息格式

元信息在协议帧里,是以标准的 uri query string 的格式进行传输的。相对于原始的二进制,这个定义,提供了标准的公共规范。不管是谁在用、在哪用,都是通用的。

  • 使用 & 作为不同变量的简隔
  • 使用 = 作为键值对的分隔符

如果有特殊字符,开发时做好编解码。

2、发送语义事件

//说明是以消费者 "a" 的身分,订阅了主题 "demo"
session.send("mq.subscribe", new StringEntity("").metaPut("topic","demo").metaPut("consumer","a));
//说明发的消息主题是 "demo"
session.send("mq.publish", new StringEntity("hi").metaPut("topic", "demo"));

3、监听语义事件

这个演示代码不科学哦,主要表达应用的效果。

public class Server {
    public void main(String[] args) throws Throwable {
        Map<String,String> topicConsumerMap ...;
        Set<Sessoin> sessionSet ...;
        
        SocketD.createServer("sd:tcp")
                .listen(new EventListener().doOn("mq.subscribe", (s,m)->{
                    String consumer = m.meta("consumer");
                    
                    s.attrPut(consumer, "1");
                    
                    sessionSet.add(s);
                    topicConsumerMap.put(m.meta("topic"), m.meta("consumer"));
                }).doOn("mq.publish", (s,m)->{
                    String consumer = topicConsumerMap.get(m.meta("topic"));
                    
                    //转发
                    sessionSet.stream().filter(s1->s1.attrHas(consumer)).forEach(s1->{
                        s1.send(m.event(), m);
                    });
                }))
                .start();
    }
}