Hi all.
We're experiencing a strange situation here. It seems that randomly AMQ does
not send a message, this happens depending on the load, this problem seems
to happen more frequently as more threads concurrently send messages on the
same queue.

We're using ActiveMQ 4.1.0 as a standalone process, with AMQ 4.0.2 libraries
on the client side. This problem has been verified also with 4.1.0
libraries.

Our usage scenario is as follows:
Messages are sent on a single queue; the messages represents requests for
which a response is expected; there is a timeout for the response; replies
are waited on a temp-queue. The temp queue is created when the
connection/session is started the first time; on the temp queue messages are
consumed via a single MessageListener.
When the client sends a request, it associates to the JMS Message:
- a correlation ID (created via a string representing the client name+a
sequence number <-- this id is created in a synchronized method)
- the JMSReplyTo setting it to the temp queue.
The client then insert (synchronizing on the map) the request into an
hashmap<String, message>, the String key is the correlation id.
The client then synchronizes on the message and sends the message [*] then
waits for the reply for a configured timeout.

When the message listener receives a message from the temp queue, extracts
the correlation ID (left unchanged by the server) from the message received
and looks up in the map the pending request, if it finds that, it changes
the message in the association <correlationid, message> with the reply
message and then issues a notify on the request message, thus waking up the
waiting client. If the Message Listener does not find anything in the
pending map for the correlation id, it simply discard the message.

The client, when woken up (from a notify of from a wait timeout), removes
(synchronizedly) from the map the object associated with the correlation id.
If it's the same message he put before the send, then it is a timeout (no
response has arrived) and returns with an error, otherwise it extracts the
response from the message received and returns the result.

We have used this mechanism some time, but only now when the number of
requests have increased significantly (300k / hour) as the number of
concurrent threads sending messages (30-40) we are experiencing a 3-4%
message loss (timeouts).

We noticed that the consumer of the request queue does not receive the
messages that go time-out. I mean: if I send 5000 messages and get 4
timeouts, i will see that the consumer on the request queue gets only 4996
messages.

Any idea about the reason of this problem?

[*] a thought about this: the send is not synchronized on the sender object
(that is used multi-threaded) but on the sent message.. could this be the
cause?
-- 
View this message in context: 
http://www.nabble.com/Messages-in-AMQ-are-randomly-not-sent--tf3572512s2354.html#a9981866
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to