rocketmq--特性之延迟消息及消息重试

1、消息延迟级别定义
    源码 MessageStoreConfig.java 是定义如下:
    private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";

    可以在brocker配置
    messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

    支持时间单位(下面有源码分析):
    s 秒 m分钟 h小时 d天

2、使用,发送消息时设置延迟级别即可。
    Message message = new Message("TestTopic", ("Hello scheduled message " + i).getBytes());
    // This message will be delivered to consumer 10 seconds later.
    //设置延迟级别为3,就找配置的 messageDelayLevel 第三顺位,就是延迟的时间。
    message.setDelayTimeLevel(3);

源码分析:

1、默认配置
MessageStoreConfig.messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";

2、延迟等级解析:
ScheduleMessageService.parseDelayLevel 方法对延迟级别做解析

public boolean parseDelayLevel() {
	HashMap<String, Long> timeUnitTable = new HashMap<String, Long>();
	timeUnitTable.put("s", 1000L);
	timeUnitTable.put("m", 1000L * 60);
	timeUnitTable.put("h", 1000L * 60 * 60);
	timeUnitTable.put("d", 1000L * 60 * 60 * 24);

	String levelString = this.defaultMessageStore.getMessageStoreConfig().getMessageDelayLevel();
	try {
		String[] levelArray = levelString.split(" ");
		for (int i = 0; i < levelArray.length; i++) {
			String value = levelArray[i];
			String ch = value.substring(value.length() - 1);
			Long tu = timeUnitTable.get(ch);

			int level = i + 1;
			if (level > this.maxDelayLevel) {
				this.maxDelayLevel = level;
			}
			long num = Long.parseLong(value.substring(0, value.length() - 1));
			long delayTimeMillis = tu * num;
			//delayLevelTable这个变量是ConcurrentMap,存放的就是延迟级别对应的延迟毫秒数。
			this.delayLevelTable.put(level, delayTimeMillis);
		}
	} catch (Exception e) {
		log.error("parseDelayLevel exception", e);
		log.info("levelString String = {}", levelString);
		return false;
	}

	return true;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值