Vert.x事件总线可保留消息

时间:2018-07-30 03:38:50

标签: vert.x event-bus vertx-verticle

我正在跟踪the vertx sockjs example,以通过SockJS事件总线桥传输数据。

发送代码:

eventBus.publish(ebAddress, data);

消费者代码:

var eb = new EventBus("http://localhost:8088/eventbus");

  eb.onopen = function () {
    eb.registerHandler("/ebaddress", function (err, msg) {
      var str = "<code>" + msg.body + "</code><br>";
      console.log(str);
    })
  }

第一个客户工作正常。但是,对于第二个连接的客户端,由于预订的是同一个eb地址,因此它无法获取已发送到第一个客户端的最新数据。如果数据输入很快,那将不是问题。但是,如果数据点之间的时间间隔较长,则第二个客户端将长时间没有数据,直到下一个新数据点到达为止。

那么,Vert.x的事件总线是否能够保留消息,以便每当新客户端连接时,它都可以立即获取最新数据?

我对Vert.x来说还很陌生,因此任何评论都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

简单答案:否,Vert.x EventBus不保留消息。因此,它也无法重播它们。只是:发送事件的总线。毕竟,当您使用JavaScript element.on("click", function() {})编写代码时,通常不会期望收到之前的所有点击,对吧?

但是,这并不意味着不可能。
在您的JavaScript中:

eb.onopen = function () {
    // On connect your client asks on a different channel to get some previously stored messages
    eb.send("/replay", {count: 10}, null, function(err, msg) {
       // Populate your code
    });
    // Continue here as usual
    eb.registerHandler("/ebaddress", function (err, msg) {
      // Something happens here
    })
  }

当然,您需要在服务器端

  1. 持久存储一定数量的消息,无论是在内存中还是在您选择的某些存储中
  2. 收听此新的/replay频道
  3. 使用.send()用先前的邮件回复特定的客户