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; }