Hi folks, I found a situation where the handling of timestamps/expirations by ActiveMQ 5.10 appears not to be correct, and unfortunately -- being this a consumer side issue -- it does not appear to be solvable via classic TimeStampingBrokerPlugin tweaks.
Scenario: S1\ Broker B1 runs on HOST1 S2\ Producer P1 is a java JMS application running on HOST1 S3\ HOST1 is on UTC timezone S4\ B1 has BrokerTimestampingPlugin with futureOnly=true configured (even if I think it does not play any role in this specific case) S4\ Consumer C1 is a java JMS API application running on HOST2 S5\ Consumer C2 is a java STOMP API application running on HOST2 S6\ HOST2 is on UTC timezone and its clock is 3 mins ahead of HOST1 clock Test case: T1\ P1 sends message M1 with TTL=1 minute T2\ C1 on HOST2 immediately tries to receive a message but it does not find it because according to HOST2 clock that message has already expired (see [*] trace) T3\ C2 on HOST2 tries to receive a message and it succeeds Questions/congeptures: Q1\ The behaviour looks client API/technology dependent, is this expected? [I think it's not] Q2\ It looks like the JMS layer in C1 is re-checking expiration on candidate messages "served" to it by the broker, causing the reported issue: is there a way to inhibit this extra logic in JMS? Q3\ Is my assumption about BrokerTimestampingPlugin being useless here correct? [It can only influence the produced messages and not the consumed ones] If there is no general solution to this it means that messages are wrongly ignored by ActiveMQ JMS consumers every time these [not so uncommon] conditions are verified: F1\ the consumer clock runs ahead of the broker clock by X seconds F2\ the TTL of messages is less than X seconds F3\ the consumer is a java JMS application Please help! Cheers, F. ----- [*] Trace showing C1 misperception of M1 expiration 2014-10-21 15:53:11,987 [TestListener] DEBUG ActiveMQMessageConsumer .dequeue - ID:gd-57426-1413899591527-1:1:1:1 received expired message: MessageDispatch {commandId = 0, responseRequired = false, consumerId = ID:gd-57426-1413899591527-1:1:1:1, destination = queue://TEST, message = ActiveMQTextMessage {commandId = 9, responseRequired = false, messageId = ID:narsil104.narsil104-29953-1413889401564-3:3:1:1:5, originalDestination = null, originalTransactionId = null, producerId = ID:narsil104.narsil104-29953-1413889401564-3:3:1:1, destination = queue://TEST, transactionId = null, expiration = 1413898985466, timestamp = 1413898385466, arrival = 0, brokerInTime = 1413898385466, brokerOutTime = 1413898389795, correlationId = , replyTo = null, persistent = false, type = , priority = 0, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@642a590d, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = Exp 5 min}, redeliveryCounter = 0