第一个问题,“Apache RocketMQ 的定时消息时长最大值默认为 24 小时,这个有办法设置超过这个时间限制吗?”
答案是:可以通过修改消息的 DELAY_TIME_LEVEL 来实现延时超过默认值 24 小时的功能,不过建议不要设置过长的延时时间,因为长时间的延时可能会导致占用过多的 RocketMQ 服务资源。
第二个问题,“可以延时任意时间吗?”
答案是:在 RocketMQ 4.4.0 之后的版本中提供了更为灵活的定时功能,即支持按照时间戳来设置延时消息。您可以通过在消息 Headers 中添加 DELAY_TIME_LEVEL=0 和 SCHEDULE_TOPIC、SCHEDULE_TIME 属性,来实现按照时间戳来设置延时的消息。例如:
Message msg = new Message("TestTopic", "TagA", "Hello RocketMQ".getBytes());
msg.putUserProperty(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "0");
msg.putUserProperty(MessageConst.PROPERTY_SCHEDULE_TOPIC, "SCHEDULE_TOPIC_XXX");
msg.putUserProperty(MessageConst.PROPERTY_SCHEDULE_TIME, "" + (System.currentTimeMillis() + 3600 * 1000));
producer.send(msg);
上述代码中,我们通过 msg.putUserProperty(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "0") 来设置消息的延时等级为 0,表示按照时间戳来进行延时;并通过 msg.putUserProperty(MessageConst.PROPERTY_SCHEDULE_TIME, "" + (System.currentTimeMillis() + 3600 * 1000)) 来设置延时时间为当前时间加上一个小时。
需要注意的是,设置了时间戳的延时消息会在 SCHEDULE_TIME 所制定的时间到达之后被立即发送,因此在消息发送前需要确保相应的延时时间已经到达。