前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mq监听死信队列后如何处理

mq监听死信队列后如何处理

作者头像
疯狂的KK
发布2020-09-14 15:52:58
1.4K0
发布2020-09-14 15:52:58
举报
文章被收录于专栏:Java项目实战Java项目实战

昨天试了半天为啥监听不到死信队列的消息,原因是打开方式不对,还有死信队列就一条消息,没意思。

什么事务啊?我都没启用事务,他怎么就进去了呢?

你不说重试是默认6次吗?我都没改配置,怎么就进了?

1.如何让消息进入死信队列?

代码语言:txt
复制
1.给ActiveMQConnectionFactory配上重发机制;
2.给DefaultMessageListenerContainer配置事务;

或者给消息设置过期时间,过期后进入死信队列

我都没启用事务,说那些都是扯淡,将一个业务消费者干掉,然后将此消费者变为监听死信队列消费者,jmeter开10000线程循环去调

消费者消费不到,然后每次消息出列+1,然后死信队列+1

关于重试机制RedeliveryPolicy

在ActiveMQConnectionFactory可设置RedeliveryPolicy,如果不设置则为默认

代码语言:txt
复制
 /**
     * Sets the global default redelivery policy to be used when a message is delivered
     * but the session is rolled back  会话会被回滚
     */
    public void setRedeliveryPolicy(RedeliveryPolicy redeliveryPolicy) {
        this.redeliveryPolicyMap.setDefaultEntry(redeliveryPolicy);
    }

activemq官网API

代码语言:txt
复制
http://activemq.apache.org/maven/apidocs/org/apache/activemq/RedeliveryPolicy.html

如果自定义

代码语言:txt
复制
 RedeliveryPolicy redeliveryPolicy= new RedeliveryPolicy();  
 //是否在每次尝试重新发送失败后,增长这个等待时间  
 redeliveryPolicy.setUseExponentialBackOff(true);  
 //重发次数,默认为6次   这里设置为10次  
 redeliveryPolicy.setMaximumRedeliveries(10);  
 //重发时间间隔,默认为1秒  
 redeliveryPolicy.setInitialRedeliveryDelay(1);  
 //第一次失败后重新发送之前等待500毫秒,第二次失败再等待500 * 2毫秒,这里的2就是value  
 redeliveryPolicy.setBackOffMultiplier(2);  
 //是否避免消息碰撞  
 redeliveryPolicy.setUseCollisionAvoidance(false);  
 //设置重发最大拖延时间-1 表示没有拖延只有UseExponentialBackOff(true)为true时生效  
 redeliveryPolicy.setMaximumRedeliveryDelay(-1);其他的方法可以看看源码

其他的方法可以看看源码

重试不是6次吗?

代码语言:txt
复制
public class RedeliveryPolicy extends DestinationMapEntry implements Cloneable, Serializable {

    public static final int NO_MAXIMUM_REDELIVERIES = -1;
    public static final int DEFAULT_MAXIMUM_REDELIVERIES = 6;
    默认确实是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;

这里有个类似Hashmap的负载因子的东西,有一个波动范围,但本地的是4次

代码语言:txt
复制
protected double collisionAvoidanceFactor = 0.15d;

2.消费到死信队列存的什么东西?

呐,就存的这玩意

object是我们想要的

代码语言:txt
复制
消费内容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.新问题死信队列里存的对象或消息是动态的如何处理?

1.给业务指定一个死信队列名称,一对一的去消费死信队列,这样就知道入队和出队的内容了

2.入队之前给队列加一个属性值type,使用枚举判断转成什么类型,或者直接instance of,或者使用前缀/或缀什么的去转。

然后在消费时结合业务逻辑去处理就好了,如果转对象成功,去查库,

如果查到数据,判断最后操作时间如果在库里的时间后面则执行此条数据,如果在库里时间之前则删掉队列的这条消息或者不处理

如果查不到数据则直接执行本条数据。

话不多说,先来他10万次

另外业务中遇到死信队列的问题了吗?

没手动狗头,只是在队列群中多看了它一眼,发现死信队列出现在我面前,就引发这么多问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 赵KK日常技术记录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档