AMQ的持久化問題

2021-08-28 03:09:50 字數 1550 閱讀 6490

前言

​ 前面一篇amq專題中,我們發現對於topic這種型別的訊息,即使將deliverymode設定為持久化,只要生產者在消費者之前啟動。訊息生產者發布的訊息還是會丟失。這是符合jms規範的。

當然,作為乙個如此活躍的開源訊息中介軟體,在實現jms基本規範之後,必然會通過擴充套件的方式來實現topic的持久化訂閱。

而所謂的deliverymode持久化和訂閱持久化還是兩個不同的概念。本篇部落格我們就通過例項來一**竟。

deliverymode持久化

​ 在前面一篇中,我們通過producer.setdeliverymode(deliverymode.persistent);將訊息傳遞特性置為持久化,當時嘗試過當訊息型別是topic的時候,不管該值設定為啥,只要先啟動producer,那麼對於後啟動的consumer都無法獲取原來發布的主題。

​ 那麼這個deliverymode究竟是用來幹啥的呢?

​ 我這裡自己通過**進行了如下測試,測試步驟和結果如下:

​ 持久化和非持久化最終佇列控制台分別如下:

至此,不難發現,deliverymode的是否持久化是針對activemq伺服器是否重啟而言的。對於不支援持久化的設定,當mq重啟之後,沒有被消費的訊息就會丟失。而支援持久化的設定,只要訊息沒有被消費,重啟mq,仍然能被新加入的consumer消費。
訂閱持久化​ jms的規範是沒有要求實現訂閱持久化的。所幸的是activemq實現了這個特性。個人認為所謂的訂閱持久化相對於訊息的持久化,不過是一種偽持久化。先不做太多說明,我們直接看乙個示例**:

生產者

public class ******producer 

// step7: 如果開啟了事務 ,此時需要呼叫session提交操作

// session.commit();

} catch (exception e) finally catch (jm***ception e) }}

}}

消費者

public class ******consumer  catch (jm***ception e) 

}});

timeunit.seconds.sleep(200); // 睡眠200秒,使得客戶端可以接收到對應訊息

} catch (exception e) finally catch (jm***ception e) }}

}}

​ 最終我的驗證步驟和結果如下:

​ 分析以上步驟,我最終對這種偽持久化訂閱的總結如下:

總結

sparkRDD的持久化問題

spark的rdd與其他dataset都可以做持久化,關於持久化的等級也可根據自身需求選擇關於持久化等級可檢視官網 這裡記錄一次關於持久化的直觀感受 在專案中需要對一批資料做三次校驗,1.通用校驗,2.欄位名稱合法性校驗,3.欄位值得型別校驗。由於需要對通過每一次校驗的結果做統計來寫報告所以偽 如下...

quartz 持久化失效問題

今天在開發乙個功能的時候,需要用到定時器在某個時間段進行定時執行,專案裡面原來就配置有跟定時器相關的配置了,大致如下,配置今天在開發乙個功能的時候,需要用到定時器在某個時間段進行定時執行,專案裡面原來就配置有跟定時器相關的配置了,大致如下,配置了乙個 定時器工廠類 然後我模仿加了乙個自己的定時任務配...

redux資料持久化問題

redux的資料在頁面重新整理的時候會變成初始化狀態 將redux的資料存到本地儲存可以實現避免這種情況 在reducers修改redux的時候將資料儲存起來 reducer引數 1.初始化state 2.actions import as actiontype from contents msg ...