java-nats-streaming:服务器重新连接后发布消息

时间:2018-11-07 13:39:40

标签: java nats-streaming-server

我有一个设置了3个节点的NATS流群集。似乎我的Java应用程序在服务器停机期间发布的NATS消息丢失了(即,当我的服务器备份并运行时,它不再重新发布)。

更详细的描述:

  1. NATS群集联机。发布者和订阅者应用程序联机。发布者开始每秒发布一条消息。订户接收消息。
  2. NATS服务器已关闭。发布者继续发布消息(我们称这些消息为“离线消息”)。订阅者停止接收任何内容
  3. NATS服务器重新联机。订阅者再次开始接收消息,但从未收到“脱机消息”。

我的发布者和订阅者应用程序都配置为尝试重新连接到NATS服务器,并且不超时。我整个都没有例外。

NATS连接:

Options options = new Options.Builder().servers(serverList).maxReconnects(-1).build();

Connection nc = Nats.connect(options);

StreamingConnectionFactory cf = new StreamingConnectionFactory(natsProperties.getClusterId(), natsProperties.getClientId());
cf.setNatsConnection(nc);
streamingConnection = cf.createConnection();

发布者:

// subject and message String variables are passed in
streamingConnection.publish(subject, message.getBytes());

订户:

streamingConnection.subscribe(subject, new MessageHandler() {
    public void onMessage(Message m) {
        System.out.prinf("Received msg: %s\n", m.getData())
    }
},  new SubscriptionOptions.Builder().durableName(durableName).build());

从文档中看,Java NATS客户端似乎内置了一个重新连接缓冲区。我尝试将缓冲区增加10倍,但无济于事(而且,我的消息仅包含2位数字)。我如何重新发送这些“离线消息”?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,唯一的解决方案是我看到了另一种订阅方法已被占用,保存了消息序列,但是我认为这不是最好的

   // Receive messages starting at a specific sequence number
   sc.subscribe("foo", new MessageHandler() {
   public void onMessage(Message m) {
     logger.info("Sequence message " +  m.getSequence());
     System.out.printf("Received a message: %s\n", m.getData());
   }
   }, new SubscriptionOptions.Builder().startAtSequence(22).build());