1

我正在按照vertx sockjs 示例通过 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 还是很陌生,所以任何评论都将不胜感激。

4

1 回答 1

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()以前的消息回复特定客户端
于 2018-08-02T21:45:50.300 回答