NATS持久消息Java客户端

NATS持久消息Java客户端,java,message-queue,nats-streaming-server,Java,Message Queue,Nats Streaming Server,有没有人有过将NATS流服务器与Java客户端结合使用的经验?具体来说,我不知道如何使用Java客户机检索订阅服务器脱机时发送的消息 我可以看到使用可以发布消息,然后添加订阅以检索所有已发布的消息。这在NATS流媒体文档中,它的工作原理与广告一样 发布几条消息。对于每种出版物,您都应该获得 结果 运行订阅服务器客户端。 使用--all标志接收所有已发布的消息 我正试着用这个。我不知道是否只是我没有找到类似的方法调用,或者Java客户端中是否不存在该特性 这是我试过的 import io.

有没有人有过将NATS流服务器与Java客户端结合使用的经验?具体来说,我不知道如何使用Java客户机检索订阅服务器脱机时发送的消息

我可以看到使用可以发布消息,然后添加订阅以检索所有已发布的消息。这在NATS流媒体文档中,它的工作原理与广告一样

发布几条消息。对于每种出版物,您都应该获得 结果

运行订阅服务器客户端。 使用--all标志接收所有已发布的消息

我正试着用这个。我不知道是否只是我没有找到类似的方法调用,或者Java客户端中是否不存在该特性

这是我试过的

    import io.nats.client.Connection;
import io.nats.client.ConnectionFactory;
import io.nats.client.Constants;
import io.nats.client.Message;
import io.nats.client.SyncSubscription;

import java.io.IOException;
import java.security.SecureRandom;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class NatsTest2 {

  private static final SecureRandom random = new SecureRandom();

  public static void main(String... args) throws Exception {
    final ConnectionFactory factory = new ConnectionFactory(Constants.DEFAULT_URL);
    try (final Connection conn = factory.createConnection()) {
      // Simple Async Subscriber
      final String expectMessage = "Yum, cookies " + System.currentTimeMillis();
      works(conn, expectMessage);
      broken(conn, expectMessage);
    }
  }

  private static void works(Connection conn, String expectMessage) throws IOException, TimeoutException {
    final String queue = Long.toString(random.nextLong());
    System.out.print(queue + "=>");
    try (final SyncSubscription subscription = conn.subscribeSync(queue)) {
      conn.publish(queue, expectMessage.getBytes());
      subscribe(subscription);
    }
  }

  private static void broken(Connection conn, String expectMessage) throws IOException, TimeoutException {
    final String queue = Long.toString(random.nextLong());
    System.out.print(queue + "=>");
    conn.publish(queue, expectMessage.getBytes());
    try (final SyncSubscription subscription = conn.subscribeSync(queue)) {
      subscribe(subscription);
    }
  }

  private static void subscribe(SyncSubscription subscription) throws IOException, TimeoutException {
    final Message message = subscription.nextMessage(1, TimeUnit.SECONDS);
    System.out.println(new String(message.getData()));
  }
}
这就产生了输出

-8522002637987832314=>Yum, cookies 1473462495040
-3024385525006291780=>Exception in thread "main" java.util.concurrent.TimeoutException: Channel timed out waiting for items

如果您使用的是
nats流媒体服务器
,则需要使用客户端。您要查找的功能(订阅历史消息)仅存在于该客户端中

无论如何,下面是您看到如何使用
jnats
客户端的原因:

nats流媒体服务器
当前嵌入了一个nats服务器(
gnatsd
),因此允许常规nats客户端使用标准nats功能,这就是您看到的

在您的示例代码中,
works()
恰好起作用,因为您的订阅在发布消息之前已经创建(换句话说,
try with resources
块保证订阅在任何其他事件发生之前已经处于活动状态)。因此,您并没有真正收到过去发布的消息;您正在接收订阅启动后发布的消息

break()
示例不起作用,因为它实际上是在创建订阅之前发布消息的,而服务器会丢弃消息,因为没有兴趣(尚未)

    import io.nats.client.Connection;
import io.nats.client.ConnectionFactory;
import io.nats.client.Constants;
import io.nats.client.Message;
import io.nats.client.SyncSubscription;

import java.io.IOException;
import java.security.SecureRandom;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class NatsTest2 {

  private static final SecureRandom random = new SecureRandom();

  public static void main(String... args) throws Exception {
    final ConnectionFactory factory = new ConnectionFactory(Constants.DEFAULT_URL);
    try (final Connection conn = factory.createConnection()) {
      // Simple Async Subscriber
      final String expectMessage = "Yum, cookies " + System.currentTimeMillis();
      works(conn, expectMessage);
      broken(conn, expectMessage);
    }
  }

  private static void works(Connection conn, String expectMessage) throws IOException, TimeoutException {
    final String queue = Long.toString(random.nextLong());
    System.out.print(queue + "=>");
    try (final SyncSubscription subscription = conn.subscribeSync(queue)) {
      conn.publish(queue, expectMessage.getBytes());
      subscribe(subscription);
    }
  }

  private static void broken(Connection conn, String expectMessage) throws IOException, TimeoutException {
    final String queue = Long.toString(random.nextLong());
    System.out.print(queue + "=>");
    conn.publish(queue, expectMessage.getBytes());
    try (final SyncSubscription subscription = conn.subscribeSync(queue)) {
      subscribe(subscription);
    }
  }

  private static void subscribe(SyncSubscription subscription) throws IOException, TimeoutException {
    final Message message = subscription.nextMessage(1, TimeUnit.SECONDS);
    System.out.println(new String(message.getData()));
  }
}
-8522002637987832314=>Yum, cookies 1473462495040
-3024385525006291780=>Exception in thread "main" java.util.concurrent.TimeoutException: Channel timed out waiting for items