MQ生产者与消费者存在于不同的主机A和B上,如果A与B的服务器时间相差太多(分钟级别),有可能A生产的消息对于B来讲过时了,B就不接收了。解决的办法是A与B两台机器的时间需要同步(大致要同步)
发送消息后,在session中会对消息进行封装,添加过期时间
long expiration = 0L; if (!producer.getDisableMessageTimestamp()) { long timeStamp = System.currentTimeMillis(); message.setJMSTimestamp(timeStamp); if (timeToLive > 0) { expiration = timeToLive + timeStamp; } } message.setJMSExpiration(expiration); message.setJMSPriority(priority); message.setJMSRedelivered(false);
broker 检查消息是否过期时,时根据消息expiration和服务器时间比较大小
public boolean isExpired() { long expireTime = getExpiration(); return expireTime > 0 && System.currentTimeMillis() > expireTime; }
本文探讨了MQ生产者与消费者在不同主机间因时间差异导致消息过期的问题。详细介绍了消息过期时间的设置与检查流程,强调了服务器时间同步的重要性。
1万+

被折叠的 条评论
为什么被折叠?



