Vert.x Event Bus для сохранения сообщения

Я следую примеру 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, поэтому буду благодарен за любые комментарии.


person blue123    schedule 30.07.2018    source источник
comment
Я не думаю, что Vert.x Eventbus позволяет вам это делать. В качестве обходного пути вы можете создать на сервере потребителя, который подписывается на тему и сохраняет последние N сообщений. На стороне клиента клиент-потребитель выдает запрос (точка-точка) потребителю на сервере, чтобы получить последние сообщения перед прослушиванием основной темы.   -  person suenda    schedule 30.07.2018
comment
@suenda, это тоже похоже на план. Говоря по схеме точка-точка, вы говорите о чем-то вроде RESTful API?   -  person blue123    schedule 31.07.2018
comment
Нет, под «точка-точка» я имею в виду, что вы отправляете сообщение через метод .send() определенному компоненту через EventBus. Подробную информацию см. В документации vertx.io/docs/vertx-core/java / # _ the_event_bus_api < / а>   -  person suenda    schedule 31.07.2018


Ответы (1)


Простой ответ: нет, 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(), чтобы ответить конкретному клиенту предыдущими сообщениями
person Alexey Soshin    schedule 02.08.2018