2012-09-04 40 views
0

在一個Mule流中,我想添加一個異常處理程序,它在發生異常時將消息轉發到「重試隊列」。但是,我不希望此重試邏輯自動運行。相反,我寧願收到通知,以便我可以查看錯誤,然後決定是否重試隊列中的所有消息。查詢Mule ESB VM隊列中的消息數

我不想收到每個例外的通知。我寧願有一個每15分鐘運行一次的計劃作業,並檢查此重試隊列中是否有消息,然後只發送通知(如果有)。

有什麼方法可以確定當前有多少消息在持久的VM隊列中?

回答

1

假設你使用默認的虛擬機隊列的持久性機制,而VM連接器被命名爲vmConnector,你可以這樣做:

final String queueName = "retryQueue"; 
int messageCount = 0; 

final VMConnector vmConnector = (VMConnector) muleContext.getRegistry() 
    .lookupConnector("vmConnector"); 

for (final Serializable key : vmConnector.getQueueProfile().getObjectStore().allKeys()) 
{ 
    final QueueKey queueKey = (QueueKey) key; 
    if (queueName.equals(queueKey.queueName)) 
    { 
     messageCount++; 
    } 
} 

System.out.printf("Queue %s has %d pending messages%n", queueName, messageCount); 
+0

太好了!謝謝。我很驚訝沒有更簡單的方法來做到這一點。必須遍歷存儲中的每條消息來計算匹配的名稱效率相當低。但只打算每5分鐘左右運行一次該流程。 – Jeff

+1

這是默認的方式。您可以嘗試用一個由'PartitionableObjectStore'支持的缺省'QueueStore'(由'ListableObjectStore'支持)替換,每個隊列名稱使用不同的分區。這樣,右分區上的allKeys()。count就會直接消息計數。 –