2013-06-27 47 views
10

我是JMS的新手。據我所知Consumers是能夠挑選隊列/主題的消息。那麼爲什麼你需要一個MessageListener因爲Consumers會知道他們什麼時候收到郵件?這種MessageListener的實際用途是什麼?JMS中的MessageListener和消費者之間有什麼區別?

編輯:從Javadoc of MessageListener

MessageListener對象被用來接收異步傳遞 消息。

每個會話都必須確保它將消息串行傳遞給 偵聽器。這意味着分配給同一個會話的一個或多個消費者 的監聽者可以假設onMessage方法在下一條消息之前不會被調用 ,直到會話完成最後一次調用。

所以我的條款異步連續在一起的使用之間的混淆。這兩個術語在描述MessageListener的特徵時如何相關?

回答

17

不同的是,的MessageConsumer用於同步接收消息:

mc.setMessageListener(new MessageListener() { 
    public void onMessage(Message msg) { 
     ... 
    } 
}); 
+0

請參閱編輯。 – Geek

+0

@Evgeniy \t在AUTO_ACKNOWLEDGEMENT模式下(非事務性) 如果執行receive()[synchronous]方法或onMessage()[aysnc]方法時發生故障,消息會自動重新傳遞?鏈接:http://stackoverflow.com/questions/18712399/auto-acknowledgement-modenon-transactional-receive-vs-onmessage –

9

docs

對於同步收據,客戶端可使用的其接收方法中的一種消息用戶請求下一個消息。

對於異步輸送,客戶端可以註冊與消息消費者的MessageListener對象。

+0

+1對於鏈接。 – Santosh

2

一個主要的區別:

MessageConsumer mc = s.createConsumer(queue); 
Message msg = mc.receive(); 

對於異步傳送中,我們可以用一個消息用戶註冊MessageListener對象根據我的知識沒有在其他人聲明的答案是,MessageConsumer可以利用MessageSelectors,因此有能力消費它感興趣的消息,其中因爲MessageListener會收聽所有消息。

從J2EE教程文檔http://docs.oracle.com/javaee/5/tutorial/doc/bnceh.html

JMS消息選擇
如果你的消息應用程序需要過濾收到的消息,您可以使用JMS API消息選擇,它允許一個消息消費者指定它感興趣的消息。消息選擇器將過濾消息的工作分配給JMS提供者而不是應用程序。

相關問題