Java ActiveMQ寄存器侦听器到StompConnection

Java ActiveMQ寄存器侦听器到StompConnection,java,jms,activemq,stomp,Java,Jms,Activemq,Stomp,我正在使用at示例的一个变体从队列接收消息。我试图做的是继续收听队列,并在收到新消息时执行一些操作。问题是我找不到一种方法将侦听器注册到任何相关对象。我试过这样的方法: public static void main(String args[]) throws Exception { StompConnection connection = null; try { connection = new StompConnection(); connec

我正在使用at示例的一个变体从队列接收消息。我试图做的是继续收听队列,并在收到新消息时执行一些操作。问题是我找不到一种方法将侦听器注册到任何相关对象。我试过这样的方法:

public static void main(String args[]) throws Exception {
    StompConnection connection = null;
    try {
        connection = new StompConnection();
        connection.open("localhost", 61613);
        connection.connect("admin", "activemq");
        connection.subscribe("/queue/worker", Subscribe.AckModeValues.AUTO);
        while (true) {
            StompFrame message = connection.receive();
            System.out.println(message.getBody());
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }
}

但这不起作用,因为几秒钟后会发生超时(
java.net.SocketTimeoutException:Read timed out
)。我可以做些什么来无限期地监听这个队列吗?

ActiveMQ的StompConnection类是一个相对原始的STOMP客户端。它不能异步回调消息或无限期等待。您可以通过超时来接收,但取决于您是否使用STOMP v1.1,如果没有及时接收到心跳,它仍可能提前超时。当然,您可以随时捕获超时异常并重试


对于通过Java的STOMP,最好使用或类似的工具,其行为类似于真正的JMS客户机,并允许异步消息接收

ActiveMQ的StompConnection类是一个相对原始的STOMP客户端。它不能异步回调消息或无限期等待。您可以通过超时来接收,但取决于您是否使用STOMP v1.1,如果没有及时接收到心跳,它仍可能提前超时。当然,您可以随时捕获超时异常并重试


对于通过Java的STOMP,最好使用或类似的工具,其行为类似于真正的JMS客户机,并允许异步消息接收

@timbish:我尝试了StompJMS,但找不到任何可以使用的示例(也许你可以提供一个链接)。我通过将超时设置为0“修复”了这个问题,这似乎是阻塞。

@Tim Bish:我尝试了StompJMS,但找不到任何可以使用的示例(也许您可以提供链接)。我通过将超时设置为0“修复”了这个问题,这似乎是阻塞。

即使我也面临同样的问题。。您可以通过向receive()方法添加超时来解决此问题

声明一个长类型变量

long waitTimeOut = 5000;   //this is 5 seconds
现在修改您的接收函数,如下所示

StompFrame message = connection.receive(waitTimeOut);

这肯定会奏效的

就连我也面临着同样的问题。。您可以通过向receive()方法添加超时来解决此问题

声明一个长类型变量

long waitTimeOut = 5000;   //this is 5 seconds
现在修改您的接收函数,如下所示

StompFrame message = connection.receive(waitTimeOut);

这肯定会奏效的

我相信在源代码树中有一些示例,只需从Git中提取并查看一下。我认为ActiveMQ Apollo还附带了一些使用StompJMS的示例。我相信在源代码树中有一些示例,只需从Git中拉出来看看。我认为ActiveMQ Apollo还附带了一些使用StompJMS的示例。