1. 程式人生 > >ActiveMQ事務、非同步傳送、訊息確認概念

ActiveMQ事務、非同步傳送、訊息確認概念

訊息事務     訊息事務是在生產者producer到broker或broker到consumer過程中同一個session中發生的,保證幾條訊息在傳送過程中的原子性。     在支援事務的session中,producer傳送message時在message中帶有transactionID。broker收到message後判斷是否有transactionID,如果有就把message儲存在transaction store中,等待commit或者rollback訊息。 訊息生產者-非同步傳送    訊息生產者使用持久(persistent)傳遞模式傳送訊息的時候,Producer.send() 方法會被阻塞,直到 broker 傳送一個確認訊息給生產者(ProducerAck),這個確認訊息暗示broker已經成功接收到訊息並把訊息儲存到二級儲存中。這個過程通常稱為同步傳送
。  如果應用程式能夠容忍一些訊息的丟失,那麼可以使用非同步傳送。非同步傳送不會在受到 broker 的確認之前一直阻塞 Producer.send 方法。    但有一個例外,當傳送方法在一個事務上下文中時,被阻塞的是 commit 方法而不是 send 方法。commit 方法成功返回意味著所有的持久訊息都以被寫到二級儲存中。    想要使用非同步,在brokerURL中增加 jms.alwaysSyncSend=false&jms.useAsyncSend=true   如果設定了alwaysSyncSend=true系統將會忽略useAsyncSend設定的值都採用同步      1) 當alwaysSyncSend=false時,“NON_PERSISTENT”(非持久化)、事務中的訊息將使用“非同步傳送”      2) 當alwaysSyncSend=false時,如果指定了useAsyncSend=true,“PERSISTENT”型別的訊息使用非同步傳送。如果useAsyncSend=false,“PERSISTENT”型別的訊息使用同步傳送。 總結:預設情況(alwaysSyncSend=false,useAsyncSend=false),非持久化訊息、事務內的訊息均採用非同步傳送;對於持久化訊息採用同步傳送。
   jms.sendTimeout:傳送超時時間,預設等於0,如果jms.sendTimeout>0將會忽略(alwaysSyncSend、useAsyncSend、訊息是否持久化)所有的訊息都是用同步傳送!    即使使用非同步傳送,也可以通過producerWindowSize來控制傳送端無節制的向broker傳送訊息 producerWindowSize:視窗尺寸,用來約束在非同步傳送時producer端允許積壓的(尚未ACK)的訊息的尺寸,且只對非同步傳送有意義。每次傳送訊息之後,都將會導致memoryUsage尺寸增加(+message.size),當broker返回producerAck時,如果達到了producerWindowSize上限,即使是非同步呼叫也會被阻塞,防止不停向broker傳送訊息。      通過jms.producerWindowSize=。。。來設定 訊息消費者-訊息確認
1、確認機制(ack_mod)       AUTO_ACKNOWLEDGE = 1    自動確認       CLIENT_ACKNOWLEDGE = 2    客戶端手動確認          DUPS_OK_ACKNOWLEDGE = 3    自動批量確認       SESSION_TRANSACTED = 0    事務提交併確認       ACK_MODE描述了Consumer與broker確認訊息的方式(時機),比如當訊息被Consumer接收之後,Consumer將在何時確認訊息。所以ack_mode描述的不是producer於broker之間的關係,而是customer於broker之間的關係。       對於broker而言,只有接收到ACK指令,才會認為訊息被正確的接收或者處理成功了,通過ACK,可以在consumer與Broker之間建立一種簡單的“擔保”機制.       session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);       第一個引數:是否支援事務,如果為true,則會忽略第二個引數,自動被jms伺服器設定為SESSION_TRANSACTED