pub和sub的实现-tcp
Eventmesh-sdk-java作为客户端,与eventmesh-runtime通信,用于完成消息的发送和接收。
那么pub和sub作为客户端,在eventmesh中是怎么实现的?
结构
我们首先看到sdk-java中tcp这一部分的结构:
common部分定义了tcp协议下广播消息、异步消息都会用到的公共方法,impl是对tcp的pub和sub的真正实现。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lh9gNtDL-1633765330465)(../../images/blog/structure.png)]](https://i-blog.csdnimg.cn/blog_migrate/df3289f22b8f9e4cce2442a383b5e76f.png)
下面来具体介绍一下三个实现类的功能,下面是对应的类图:
- DefaultEventMeshClient:实现了EventMeshClient接口,用来定义一个具备pub和sub功能的客户端。
- SimplePubClientImpl:实现了SimplePubClient接口,同时还继承了TcpClient ,用来定义一个具备pub功能的客户端。
- SimpleSubClientImpl:实现了SimpleSubClient接口,同时也继承了TcpClient ,用来定义一个具备sub功能的客户端。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HvqpnLMh-1633765330467)(../../images/blog/Impl-class-diagram.png)]](https://i-blog.csdnimg.cn/blog_migrate/955cbeeefd5fc1a9765e56bf98b454f9.png)
代码
- 对于client的实现,首先是要和runtime进行连接,也就是和服务器进行连接,连接的过程是:client发送心跳包给server,server对心跳包进行回应,然后client发送连接请求,接收到server的回应之后,客户端和服务器连接成功。在EventMeshClient接口中,它是这样定义连接的:
void init() throws Exception;
void heartbeat() throws Exception;
- 在DefaultEventMeshClient中具体的实现如下:
public void init() throws Exception {
this.subClient.init();
this.pubClient.init();
}
public void heartbeat() throws Exception {
this.pubClient.heartbeat();
this.subClient.heartbeat();
}
-
也就是说,一个客户端和服务器的连接被分成了两个部分,一个是pub客户端的连接,一个是sub客户端的连接。那我们具体来看到两个客户端的实现,因为两个客户端实现有点类似,所以我们这里以
SimpleSubClientImpl为例进行说明:client和server的握手过程
HELLO_REQUEST(2), //client发给server的握手请求
HELLO_RESPONSE(3), //server回复client的握手请求
//SimpleSubClientImpl
public void init() throws Exception {
//指向server的启动入口
open(new Handler());
//设置了hello的header和body部分,client和server进行握手
hello();
logger.info("SimpleSubClientImpl|{}|started!", clientNo);
}
client和server的发送心跳包过程
HEARTBEAT_REQUEST(0), //client发给server的心跳包
HEARTBEAT_RESPONSE(1), //server回复client的心跳包
//SimpleSubClientImpl
public void heartbeat() throws Exception {
task = scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
//如果不是处于活跃状态,就重新连接
if (!isActive()) {
SimpleSubClientImpl.this.reconnect();
}
//client向server发送心跳包
Package msg = MessageUtils.heartBeat();
SimpleSubClientImpl.this.io(msg, EventMeshCommon.DEFAULT_TIME_OUT_MILLS);
} catch (Exception ignore) {
}
}
},

本文详细介绍了EventMesh SDK Java中如何通过TCP协议实现pub和sub功能,包括客户端与Runtime的连接、消息发布与订阅、心跳包和断连机制。通过实例代码展示了如何使用SimplePubClient和SimpleSubClient进行消息的发送与接收操作。
最低0.47元/天 解锁文章
38万+

被折叠的 条评论
为什么被折叠?



