Hi, I'm working on ActiveMQ 5.8.0 with MySQL as a data source. The configuration of ActiveMQ is attached (activemq.xml). It is used in a basic scenario: a producer sends a short message (JSON object with 2 fields) with 5s delay to queue T on which 3 consumers listen. The consumers are created using plain Java API:
for (int i = 0; i < numberOfConsumer; i++) { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue(queueName); MessageConsumer consumer = session.createConsumer(destination); MyConsumer myConsumer = new MyConsumer(); consumer.setMessageListener(myConsumer); connection.setExceptionListener(myConsumer); consumers.add(invoiceConsumer); } MyConsumer class implements both javax.jms.ExceptionListener and javax.jms.MessageListener. URL used by consumer is: failover://(tcp://localhost:61616)?startupMaxReconnectAttempts=3&initialReconnectDelay=1000&timeout=500&maxReconnectDelay=1000&maxReconnectAttempts=-1 The problem is as follows: At times a message is not delivered to any of the consumer. However, the following messages are. I can see an entry for the corresponding message in ACTIVEMQ_MSGS table. Once I restart ActiveMQ (without a restart of an application holding the consumers), the missing message gets delivered. I enclose the full init.out in which one can see what happens under the hood of ActiveMQ (including the failing delivery of a message). Let me do a short analysis for you. Once a message is sent with 5s delay an internal job in ActiveMQ is scheduled for that: 2013-08-22 10:42:38,546 | DEBUG | ActiveMQ Transport: tcp:///127.0.0.1:43716@61616 | org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl | Scheduling Job [id=ID:localhost. localdomain-43080-1377160848385-1:1:5:1:1, startTime=Thu Aug 22 10:42:38 CEST 2013, delay=5000, period=0, repeat=0, nextTime=Thu Jan 01 01:00:00 CET 1970] When the time comes, job is fired: 2013-08-22 10:42:43,006 | DEBUG | JobScheduler:JMS | org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl | Firing Job [id=ID:localhost.localdomain-43080-1377160848385-1:1: 5:1:1, startTime=Thu Aug 22 10:42:38 CEST 2013, delay=5000, period=0, repeat=0, nextTime=Thu Aug 22 10:42:43 CEST 2013] 2013-08-22 10:42:43,008 | DEBUG | JobScheduler:JMS | org.apache.activemq.broker.region.Queue | localhost Message ID:localhost.localdomain-43080-1377160848385-1:1:5:1:1 sent to que ue://T Then a bridging takes place - which *doesn't* occur for messages which actually get delivered - which I don't understand: 2013-08-22 10:42:43,017 | DEBUG | ActiveMQ BrokerService[localhost] Task-5 | org.apache.activemq.network.DemandForwardingBridgeSupport | bridging (localhost -> localhost) ID:local host.localdomain-43080-1377160848385-1:1:5:1:1, consumer: ID:localhost.localdomain-38827-1377160835122-4:1:1:1, destination queue://T, brokerPath: [ID:localhost.localdomain-38827- 1377160835122-1:1], message: ActiveMQObjectMessage {commandId = 16, responseRequired = true, messageId = ID:localhost.localdomain-43080-1377160848385-1:1:5:1:1, originalDestinatio n = null, originalTransactionId = null, producerId = ID:localhost.localdomain-38827-1377160835122-4:2:1:1, destination = queue://T, transactionId = null, expiration = 0, timestamp = 1377160958535, arrival = 0, brokerInTime = 1377160963007, brokerOutTime = 1377160963009, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, gro upID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@4a6e0a9, marshalledProperties = org.apa che.activemq.util.ByteSequence@67e779a1, dataStructure = null, redeliveryCounter = 0, size = 1117, properties = {scheduledJobId=ID:localhost.localdomain-43080-1377160848385-1:1:5: 1:1}, readOnlyProperties = false, readOnlyBody = false, droppable = false} After that a rescheduling of a job takes place: 2013-08-22 10:42:43,025 | DEBUG | ActiveMQ Transport: tcp:///127.0.0.1:43630@61616 | org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl | Scheduling Job [id=ID:localhost. localdomain-43080-1377160848385-1:1:5:1:1, startTime=Thu Aug 22 10:42:43 CEST 2013, delay=5000, period=0, repeat=0, nextTime=Thu Jan 01 01:00:00 CET 1970] and firing of the job to send a message again: 2013-08-22 10:42:48,013 | DEBUG | JobScheduler:JMS | org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl | Firing Job [id=ID:localhost.localdomain-43080-1377160848385-1:1: 5:1:1, startTime=Thu Aug 22 10:42:43 CEST 2013, delay=5000, period=0, repeat=0, nextTime=Thu Aug 22 10:42:48 CEST 2013] 2013-08-22 10:42:48,015 | DEBUG | JobScheduler:JMS | org.apache.activemq.broker.region.Queue | localhost Message ID:localhost.localdomain-43080-1377160848385-1:1:5:1:1 sent to que ue://T However, no message is seen on the consumer side whatsoever and the entry for the message remains in ACTIVEMQ_MSGS (no ACK?): ID, CONTAINER, MSGID_PROD, MSGID_SEQR, EXPIRATION, MSG, PRIORITY, XID '3', 'queue://T', 'ID:localhost.localdomain-43080-1377160848385-1:1:5:1', '1', '0', BLOB, '0', NULL For comparison, one can see a correct message sent at 10:41:38,054 in the logs. To sum up, the problem is that from time to time a message isn't delivered by ActiveMQ. Is there something wrong with the configuration either on server or consumer side? A doubtful bug in ActiveMQ? A hack for that is to restart ActiveMQ for the missing messages to be delivered. Moreover, for maintenance purposes - is there documentation / blog post / article about how ACTIVEMQ_MSGS table works (apart from the short description in 'ActiveMQ in Action' book)? What should be an action taken by DBA if a number of entries in ACTIVEMQ_MSGS table grow? I'd be grateful for any support since I'm beginning to feel helpless. Cheers, Tomek activemq.xml <http://activemq.2283324.n4.nabble.com/file/n4670572/activemq.xml> init.out <http://activemq.2283324.n4.nabble.com/file/n4670572/init.out> -- View this message in context: http://activemq.2283324.n4.nabble.com/No-message-delivery-vs-ACTIVEMQ-MSGS-tp4670572.html Sent from the ActiveMQ - User mailing list archive at Nabble.com.