JMS學習

JMS學習

(2011-03-18 10:42:14)
標籤:

雜談

分類:J2EE
JMS Architecture
jms-architecture
一般將ConnectionFactory和Destination綁定到JNDI上,然後Client查找JNDI來獲取。對於ActiveMQ可以直接構造ConnectionFactory和Destination。
Connection和Destination就是這裏的Administed Objects。
 
JMS有兩種形式:
1. 點到點(Point to Point)
jms-pointToPoint
2. 發佈/訂閱(Publish/Subscribe)
jms-publishSubscribe
它們的Destination分別是Queue和Topic。
消息消費者可以同步也可以異步的消費消息,同步consumer.receive(),異步通過MessageListener。
 
JMS API
jms-programmingModel
1. 通過ConnectionFactory來創建Connection。
2.Connection創建Session,可以指定clientID,實現durable的消息,另外start()開始消息傳輸。
3. 創建或獲取Destination
4.通過Session和Destination來創建Producer和MessageConsumer,指定Session的LocalTransaction和Acknowlege信息,Session管理LocalTransaction,創建durable的subscriber,還可以通過Session來創建消息。
5. Producer發送消息,Consumer消費消息。
 
細節概念
1. Persisent
2. Expiration
3. Acknowledgment
4. Durable
5. Local Transaction
6. Redelivery
 
Persistent
傳輸模式(DeliveryMode),默認是Persistent。如果是非Persistent的,Server當掉,消息也就丟失啦。
API調用: producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
 
Expiration
消息的存活時間,默認消息永不過期。
API調用: producer.setTimeToLive()
 
Acknowledgment
消息收到的確認方式,三種,分別是Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE和Session.DUPS_OK_ACKNOWLEDGE。
 
AUTO_ACKNOWLEDGE
一次只有一次
對於MessageListener,當onMessage()方法結束後,自動發送確認信息。
 
CLIENT_ACKNOWLEDGE
Client代碼來維護,通過調用message.acknowledge(),確認了此Session中所有收到的消息。
對於非Queue和DurableSubscription,消息隨着Session的關閉而被drop掉。而對於Queue和DurableSubscription,Server會保留這些信息,重新發送給consumer。
 
對於事務的Session來說,伴隨事務的提交,Acknowledgment發生。
 
Durable
Durable是針對Subscription來說的,DurableSubscription在特性上和Queue相同。
Durable Subscription通過Client ID和subscriptionname來區分,某一時刻,只有一個Client ID的連接,因此只能有一個Client ID下的subscription。
利用JConsole通過JMX可見監控ActiveMQ:
jmsjconsole
圖片中顯示出Subscription的結構,Subscription->Durable目錄下的nesta_client_id和nesta_faint就是ClientID,葉子節點是兩個與Client ID同名的subscription name。
 
Durable表示在Subscriber停掉的情況下,還可以收到在down掉這段時間內的消息。
jms-durableSubscriber
從圖上可以看出,如果沒有Durable的Subscription,Message M2,M4和M5將被丟失。
session.createDurableSubscriber()
session.unsubscribe()
 
Local Transaction
消息發送事務,對於同一Session的多消息發送和多消息接收,作爲一個事務。
發送消息和接收消息的兩個客戶端,擁有各自的Connection和Session,所以是兩個事務,不是一個事務。
jms-localTransactions
 
Redelivery
對於參與事務的消費者,它可以session.rollback(),這是server就會重發消息。在ActiveMQ中設置RedeliveryPolicy,ActiveMQ最大重新傳輸次數爲6。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章