我有一个设置了3个节点的NATS流群集。似乎我的Java应用程序在服务器停机期间发布的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位数字)。我如何重新发送这些“离线消息”?
答案 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());