ActiveMQ 之訊息中介軟體可靠性的保證方式

2021-10-08 04:27:46 字數 1750 閱讀 8946

非持久化:當伺服器宕機時,訊息不存在

持久化:當伺服器宕機,訊息依然存在

佇列 queue 模式下,只需要為訊息 producer 設定持久化模式為持久化即可:

// 設定訊息為持久化

messageproducer messageproducer = session.

createproducer

(queue)

;messageproducer.

setdeliverymode

(deliverymode.persistent)

;

當然,佇列預設是開啟持久化的,所以不進行設定也是可以的。

但主題的持久化就比較複雜一點,下面是主題模式的 producer **示例:

public

class

jmsproducertopicpersist

// 9、關閉資源

messageproducer.

close()

; session.

close()

; connection.

close()

; system.out.

println

("*****=== 訊息發布到 mq 完成 **********");

}}

從上面的**可以看出,除了要設定為持久化模式外,還需要把 connection.start() 移到設定持久化後面。

下面是消費者示例**:

public

class

jmsconsumertopicpersist

// 關閉資源

session.

close()

; connection.

close()

;}}

相比較生產者,消費者還需要為 connection 設定客戶id,同時還需要為會話 session 建立訂持久化閱者。

// 建立會話 session,設定第乙個引數為 true 則開啟事務

session session = connection.

createsession

(true

, session.auto_acknowledge)

;

一旦開啟事務,那麼生產者傳送訊息到佇列或者消費者從佇列中消費訊息後都需要進行事務提交,否則不生效(生產者不提交則無法傳送成功,消費者不提交則會出現重複消費的問題):

// 開啟事務後,傳送訊息和消費訊息都需要提交事務

session.

commit()

;

簽收模式為建立 session 的第二個引數,簽收分為自動簽收(session.auto_acknowledge)和手動簽收(session.client_acknowledge),一旦設定為手動簽收,則消費者在每消費一條訊息後都需要訊息的簽收函式:

while

(true

)else

}

如果不簽收的話,也會出現重複消費訊息的現象。

如果同時設定事務和簽收,那麼,事務會覆蓋簽收的範圍,也就是說,開啟了事務後,如果不提交,哪怕對訊息進行簽收也會失效。所以一旦開啟了事務,那麼不管是否開啟簽收,都要進行事務提交。

訊息中介軟體之activeMQ

使用activemq主要有以下幾點,在這裡做一下記錄。1 docker search activemq 2 docker pull webcenter activemq 3 docker images 4 docker run d name activemq p 61617 61616 p 8162...

activemq訊息中介軟體

生產者 factory new connectionfactory tcp localhost 61616 通過工廠建立連線 using iconnection connection factory.createconnection 消費者 建立連線工廠 iconnectionfactory fac...

訊息中介軟體ActiveMQ

此處用的是version 5.14.0 windows上安裝非常簡單直雙擊接執行apache activemq 5.14.0 bin win64 activemq.bat檔案 img 出現如圖所示說明執行啟動成功 linux上安裝此處略 然後瀏覽器輸入http localhost 8161 admi...