У меня есть потоковый кластер NATS с настроенными 3 узлами. Похоже, что сообщения NATS, публикуемые моим java-приложением во время простоя сервера, теряются (т.е. не переиздаются, когда мои серверы снова работают и работают).
Более подробное описание:
- Кластер NATS онлайн. Приложения издателя и подписчика приходят в онлайн. Издатель начинает публиковать сообщения каждую секунду. Подписчик получает сообщения.
- Серверы NATS отключены. Издатель продолжает публиковать сообщения (назовем эти сообщения «автономными сообщениями»). Абонент перестает получать что-либо
- Серверы 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-значных чисел). Как я могу заставить его отправить эти «автономные сообщения»?