2012-10-07 78 views
1

我使用http://svn.apache.org/repos/asf/activemq/trunk/assembly/src/release/example/src/StompExample.java的示例变体从队列中接收消息。我想要做的是继续收听队列,并在收到新消息时执行一些操作。问题是,我找不到一种方法来向任何相关对象注册侦听器。我已经试过类似:ActiveMQ注册监听器StompConnection

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

回答

1

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

对于通过Java的STOMP,您最好使用StompJMS或类似真实JMS客户端并允许异步消息接收的类似设备。

0

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

+0

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

0

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

声明一个长类型变量。

long waitTimeOut = 5000; //this is 5 seconds 

现在修改您的接收函数,如下所示。

StompFrame message = connection.receive(waitTimeOut); 

这肯定会奏效。

+0

这不适合我... – obsessiveCookie