ActiveMQ非同步傳送訊息
阿新 • • 發佈:2019-02-19
非同步傳送
訊息生產者使用持久(persistent)傳遞模式傳送訊息的時候,Producer.send() 方法會被阻塞,直到 broker 傳送一個確認訊息給生產者,這個確認訊息暗示生產者 broker 已經成功地將它傳送的訊息路由到目標目的並把訊息儲存到二級儲存中。這個過程通常稱為同步傳送。但有一個例外,當傳送方法在一個事物上下文中時,被阻塞的是 commit 方法而不是 send 方法。commit 方法成功返回意味著所有的持久訊息都以被寫到二級儲存中。
同步傳送持久訊息能夠提供更好的可靠性,但這潛在地影響了程式的相應速度,因為在接受到 broker 的確認訊息之前應用程式或執行緒會被阻塞。如果應用程式能夠容忍一些訊息的丟失,那麼可以使用非同步傳送。非同步傳送不會在受到 broker 的確認之前一直阻塞 Producer.send 方法。如果想啟動非同步傳送可以把 connector uri 的 jms.useAsyncSend 選項設為 true,如下所示:
tcp://localhost:61616?jms.useAsyncSend=true
從 ActiveMQ 5 開始可以控制非同步傳送流。也就是說,在受到 broker 的確認應答之前,生產者能夠傳送訊息給 broker 的最大資訊量。即使是非同步傳送訊息,生產者也是在收到 broker 的確認應答後才把下一條訊息傳送給 broker。當使用非同步傳送的時候,可以設定 jms.producerWindowSize(單位為位元組)屬性,當生產者中等待發送的資訊量到達設定的值時,即使沒有收到 broker 的應答訊息,生產者同樣會把這些訊息發給 broker。如下面的示例設定:
tcp://localhost:61616?jms.useAsyncSend=true&jms.producerWindowSize=1024000
單獨確認
在 ActiveMQ 5.2 中添加了一個新的確認模式,這種確認模式是特定於 ActiveMQ 的,jms 規範暫時並不支援這種確認模式。這種確認模式由 ora.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 表示,用來確認一個單獨的訊息。這中確認模式是相對於 Session.CLIENT_ACKNOWLEDGE 的,在 CLIENT_ACKNOWLEDGE 模式下,呼叫訊息的 acknowledge() 方法會確認由此 session 消費的所有訊息,而在 INDIVIDUAL_ACKNOWLEDGE 模式下,僅會確認呼叫 acknowledge() 方法的訊息。
訊息生產者使用持久(persistent)傳遞模式傳送訊息的時候,Producer.send() 方法會被阻塞,直到 broker 傳送一個確認訊息給生產者,這個確認訊息暗示生產者 broker 已經成功地將它傳送的訊息路由到目標目的並把訊息儲存到二級儲存中。這個過程通常稱為同步傳送。但有一個例外,當傳送方法在一個事物上下文中時,被阻塞的是 commit 方法而不是 send 方法。commit 方法成功返回意味著所有的持久訊息都以被寫到二級儲存中。
同步傳送持久訊息能夠提供更好的可靠性,但這潛在地影響了程式的相應速度,因為在接受到 broker 的確認訊息之前應用程式或執行緒會被阻塞。如果應用程式能夠容忍一些訊息的丟失,那麼可以使用非同步傳送。非同步傳送不會在受到 broker 的確認之前一直阻塞 Producer.send 方法。如果想啟動非同步傳送可以把 connector uri 的 jms.useAsyncSend 選項設為 true,如下所示:
tcp://localhost:61616?jms.useAsyncSend=true
從 ActiveMQ 5 開始可以控制非同步傳送流。也就是說,在受到 broker 的確認應答之前,生產者能夠傳送訊息給 broker 的最大資訊量。即使是非同步傳送訊息,生產者也是在收到 broker 的確認應答後才把下一條訊息傳送給 broker。當使用非同步傳送的時候,可以設定 jms.producerWindowSize(單位為位元組)屬性,當生產者中等待發送的資訊量到達設定的值時,即使沒有收到 broker 的應答訊息,生產者同樣會把這些訊息發給 broker。如下面的示例設定:
tcp://localhost:61616?jms.useAsyncSend=true&jms.producerWindowSize=1024000
單獨確認
在 ActiveMQ 5.2 中添加了一個新的確認模式,這種確認模式是特定於 ActiveMQ 的,jms 規範暫時並不支援這種確認模式。這種確認模式由 ora.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 表示,用來確認一個單獨的訊息。這中確認模式是相對於 Session.CLIENT_ACKNOWLEDGE 的,在 CLIENT_ACKNOWLEDGE 模式下,呼叫訊息的 acknowledge() 方法會確認由此 session 消費的所有訊息,而在 INDIVIDUAL_ACKNOWLEDGE 模式下,僅會確認呼叫 acknowledge() 方法的訊息。