今天就跟大家聊聊有關(guān)mq監(jiān)聽(tīng)死信隊(duì)列后是如何處理,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)隴西免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
昨天試了半天為啥監(jiān)聽(tīng)不到死信隊(duì)列的消息,原因是打開(kāi)方式不對(duì),還有死信隊(duì)列就一條消息,沒(méi)意思。
什么事務(wù)啊?我都沒(méi)啟用事務(wù),他怎么就進(jìn)去了呢?
你不說(shuō)重試是默認(rèn)6次嗎?我都沒(méi)改配置,怎么就進(jìn)了?
1.如何讓消息進(jìn)入死信隊(duì)列?
1.給ActiveMQConnectionFactory配上重發(fā)機(jī)制;2.給DefaultMessageListenerContainer配置事務(wù);
或者給消息設(shè)置過(guò)期時(shí)間,過(guò)期后進(jìn)入死信隊(duì)列
我都沒(méi)啟用事務(wù),說(shuō)那些都是扯淡,將一個(gè)業(yè)務(wù)消費(fèi)者干掉,然后將此消費(fèi)者變?yōu)楸O(jiān)聽(tīng)死信隊(duì)列消費(fèi)者,jmeter開(kāi)10000線程循環(huán)去調(diào)
消費(fèi)者消費(fèi)不到,然后每次消息出列+1,然后死信隊(duì)列+1
關(guān)于重試機(jī)制RedeliveryPolicy
在ActiveMQConnectionFactory可設(shè)置RedeliveryPolicy,如果不設(shè)置則為默認(rèn)
/** * Sets the global default redelivery policy to be used when a message is delivered * but the session is rolled back 會(huì)話會(huì)被回滾 */ public void setRedeliveryPolicy(RedeliveryPolicy redeliveryPolicy) { this.redeliveryPolicyMap.setDefaultEntry(redeliveryPolicy); }
activemq官網(wǎng)API
http://activemq.apache.org/maven/apidocs/org/apache/activemq/RedeliveryPolicy.html
如果自定義
RedeliveryPolicy redeliveryPolicy= new RedeliveryPolicy(); //是否在每次嘗試重新發(fā)送失敗后,增長(zhǎng)這個(gè)等待時(shí)間 redeliveryPolicy.setUseExponentialBackOff(true); //重發(fā)次數(shù),默認(rèn)為6次 這里設(shè)置為10次 redeliveryPolicy.setMaximumRedeliveries(10); //重發(fā)時(shí)間間隔,默認(rèn)為1秒 redeliveryPolicy.setInitialRedeliveryDelay(1); //第一次失敗后重新發(fā)送之前等待500毫秒,第二次失敗再等待500 * 2毫秒,這里的2就是value redeliveryPolicy.setBackOffMultiplier(2); //是否避免消息碰撞 redeliveryPolicy.setUseCollisionAvoidance(false); //設(shè)置重發(fā)最大拖延時(shí)間-1 表示沒(méi)有拖延只有UseExponentialBackOff(true)為true時(shí)生效 redeliveryPolicy.setMaximumRedeliveryDelay(-1);
其他的方法可以看看源碼
重試不是6次嗎?
public class RedeliveryPolicy extends DestinationMapEntry implements Cloneable, Serializable {
public static final int NO_MAXIMUM_REDELIVERIES = -1;
public static final int DEFAULT_MAXIMUM_REDELIVERIES = 6;
默認(rèn)確實(shí)是6次
private static Random randomNumberGenerator;
// +/-15% for a 30% spread -cgs
protected double collisionAvoidanceFactor = 0.15d;
protected int maximumRedeliveries = DEFAULT_MAXIMUM_REDELIVERIES;
protected long maximumRedeliveryDelay = -1;
protected long initialRedeliveryDelay = 1000L;
protected boolean useCollisionAvoidance;
protected boolean useExponentialBackOff;
protected double backOffMultiplier = 5.0;
protected long redeliveryDelay = initialRedeliveryDelay;
這里有個(gè)類似Hashmap的負(fù)載因子的東西,有一個(gè)波動(dòng)范圍,但本地的是4次
protected double collisionAvoidanceFactor = 0.15d;
2.消費(fèi)到死信隊(duì)列存的什么東西?
吶,就存的這玩意
object是我們想要的
消費(fèi)內(nèi)容ActiveMQObjectMessage { commandId = 5, responseRequired = true, messageId = ID: KK - 59648 - 1599635155556 - 1: 239: 1: 1: 1, originalDestination = null, originalTransactionId = null, producerId = ID: KK - 59648 - 1599635155556 - 1: 239: 1: 1, destination = queue: //add, transactionId = null, expiration = 0, timestamp = 1599636301936, arrival = 0, brokerInTime = 1599636301937, brokerOutTime = 1599636302110, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@54eae153, marshalledProperties = org.apache.activemq.util.ByteSequence@1318dd4d, dataStructure = null, redeliveryCounter = 0, size = 0, properties = {timestamp=1599636300958}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false}
3.新問(wèn)題死信隊(duì)列里存的對(duì)象或消息是動(dòng)態(tài)的如何處理?
1.給業(yè)務(wù)指定一個(gè)死信隊(duì)列名稱,一對(duì)一的去消費(fèi)死信隊(duì)列,這樣就知道入隊(duì)和出隊(duì)的內(nèi)容了
2.入隊(duì)之前給隊(duì)列加一個(gè)屬性值type,使用枚舉判斷轉(zhuǎn)成什么類型,或者直接instance of,或者使用前綴/或綴什么的去轉(zhuǎn)。
然后在消費(fèi)時(shí)結(jié)合業(yè)務(wù)邏輯去處理就好了,如果轉(zhuǎn)對(duì)象成功,去查庫(kù),
如果查到數(shù)據(jù),判斷最后操作時(shí)間如果在庫(kù)里的時(shí)間后面則執(zhí)行此條數(shù)據(jù),如果在庫(kù)里時(shí)間之前則刪掉隊(duì)列的這條消息或者不處理
如果查不到數(shù)據(jù)則直接執(zhí)行本條數(shù)據(jù)。
話不多說(shuō),先來(lái)他10萬(wàn)次
另外業(yè)務(wù)中遇到死信隊(duì)列的問(wèn)題了嗎?
沒(méi),只是在隊(duì)列群中多看了它一眼,發(fā)現(xiàn)死信隊(duì)列出現(xiàn)在我面前,就引發(fā)這么多問(wèn)題。
看完上述內(nèi)容,你們對(duì)mq監(jiān)聽(tīng)死信隊(duì)列后是如何處理有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
網(wǎng)頁(yè)題目:mq監(jiān)聽(tīng)死信隊(duì)列后是如何處理
標(biāo)題鏈接:http://jinyejixie.com/article18/jdoidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、自適應(yīng)網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站營(yíng)銷、做網(wǎng)站、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)