您好,登錄后才能下訂單哦!
這篇文章主要講解了“ActiveMq死信隊列怎么監聽”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ActiveMq死信隊列怎么監聽”吧!
想試試能不能把mq搞死,就試了下模擬并發10000個請求,最高時等待隊列數量為53,也就是說高并發時必然會出現實際業務與數據庫的數據不一致的情況,搭配redis使用時,盡可能的應當(必須)從redis里面取數據。
此時發現一條死信隊列的消息,具體產生原因不詳,分析和解決下此問題。
死信隊列的產生
activemq默認使用異步發送模式,如果設置了持久化但沒開啟事務的話,會發生消息丟失的情況,mq宕機也會丟失。
2.具體哪些情況會引發消息重發?
①Client用了transactions且在session中調用了rollback
②Client用了transactions且在調用commit之前關閉或者沒有commit
③Client在CLIENT_ACKNOWLEDGE的傳遞模式下,session中調用了recover(允許消息重發模式下)
消息的重發時間間隔為1秒,重發次數默認最高6次。
一個消息被redelivedred超過6次,消費端會給mq一個"poison ack",表示這個消息有毒,此時這個消息會被放入DLQ死信隊列。
由于我是本地mq,我可能搞下測試環境的mq,本地是重試4次后就進入死信隊列了。
在哪里改?
redeliveryPolicy.setMaximumRedeliveries(3);
public ActiveMQConnectionFactory connectionFactory() { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(brokerurl); //信任所有包下的序列化對象,解決無法發送對象消息 factory.setTrustAllPackages(true); factory.setUserName(userName); factory.setPassword(password); RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy(); redeliveryPolicy.setMaximumRedeliveries(3);// 修改重發次數為3次 factory.setRedeliveryPolicy(redeliveryPolicy); return factory; }
也可在配置文件中修改
如何處理死信隊列中的消息?
1:人工處理(太累)
2:定時任務(太耗性能)
3:監聽死信隊列
4:死信隊列寫庫
如何監聽死信隊列?
思路:死信隊列也是一個隊列,創建一個監聽器,監聽死信隊列ActiveMQ.DLQ隊列是否有消息,有消息就進行消費。
/**
* @author zhaokkstart
* @create 2020-09-07 16:27
*/
import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import org.apache.activemq.command.ActiveMQDestination;;
public class QueueMessageListener implements MessageListener{
@Override
public void onMessage(Message message) {
try {
ActiveMQDestination queues=(ActiveMQDestination)message.getJMSDestination();
if(queues.getPhysicalName().equalsIgnoreCase("ActiveMQ.DLQ")){
System.out.println("監聽隊列:"+queues.getPhysicalName()+"消費了消息:");
if (message instanceof TextMessage) {
TextMessage tm = (TextMessage) message;
try {
System.out.println("from get textMessage:\t" + tm.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (message instanceof MapMessage) {
MapMessage mm = (MapMessage) message;
try {
System.out.println("from get MapMessage:\t" + mm.getString("msgId"));
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 如果是Object消息
if (message instanceof ObjectMessage) {
ObjectMessage om = (ObjectMessage) message;
System.out.println("from get ObjectMessage:\t");
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
使用監聽還需要啟動消費者嗎?
可以不啟動消費者,需要啟動生產者
消息監聽器MessageListener
1.MessageListener2.SessionAwareMessageListener,SessionAwareMessageListener是Spring為我們提供的,它不是標準的JMS MessageListener。3.MessageListenerAdapter,MessageListenerAdapter類實現了MessageListener接口和SessionAwareMessageListener接口,它的主要作用是將接收到的消息進行類型轉換,然后通過反射的形式把它交給一個普通的Java類進行處理。其另外一個主要的功能是可以自動的發送返回消息。
1.隊列長時間無人監聽時,自動刪除該隊列,在ActiveMQ官方提供的功能列表中,有這樣一項功能:Delete Inactive Destination。它可以刪除“沒有未處理消息、并且沒有消費者的Destination”。我就覺得我們的業務隊列太多了,沒計算過,但至少實在50個以上的,沒有必要~,不常用的可以手動去啟停。
本文參考資料
ActiveMQ隊列消息積壓問題 https://blog.51cto.com/winters1224/2049432如何監聽死信隊列?https://www.cnblogs.com/zhoading/p/12009116.htmlactivemq 中如何消費已經在死信隊列中的消息 https://q.cnblogs.com/q/90513/推薦博文 https://blog.csdn.net/vop444/article/details/85222353
感謝各位的閱讀,以上就是“ActiveMq死信隊列怎么監聽”的內容了,經過本文的學習后,相信大家對ActiveMq死信隊列怎么監聽這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。