1

我在http://svn.apache.org/repos/asf/activemq/trunk/assembly/src/release/example/src/StompExample.java使用示例的变体从队列接收消息。我正在尝试做的是继续收听队列并在收到新消息后执行一些操作。问题是我找不到将侦听器注册到任何相关对象的方法。我试过类似的东西:

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)。我能做些什么来无限期地听这个队列吗?

4

3 回答 3

1

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

对于通过 Java 进行的 STOMP,您最好使用StompJMS等,它的行为类似于真正的 JMS 客户端并允许异步消息接收。

于 2012-10-07T11:01:29.627 回答
0

即使我面临同样的问题..你可以通过在你的 receive() 方法中添加超时来解决这个问题。

声明一个长类型变量。

long waitTimeOut = 5000;   //this is 5 seconds

现在修改您的接收功能,如下所示。

StompFrame message = connection.receive(waitTimeOut);

这肯定会奏效。

于 2013-11-01T20:13:27.350 回答
0

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

于 2012-10-08T01:47:21.633 回答