2012-10-07 116 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