at
org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1172)
at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1640)
- locked <0x07c45ea0> (a java.lang.Object)
you are sending sync, in your code you can do this
what you can do is play around with the async settings
ActiveMQConnectionFactory connectionFactory = new
ActiveMQConnectionFactory(user, password, url);
connectionFactory.setAlwaysSyncSend(false);
connectionFactory.setDispatchAsync(true);
connectionFactory.setAlwaysSessionAsync(true);
alternatively, you can create your own dispatch thread/queue to have complete
control of order of messages being sent etc.
one thing that stands out
"ActiveMQ Transport: tcp://localhost:61616" prio=6 tid=0x34054800 nid=0x6d8
runnable [0x3631f000..0x3631fd98]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at
org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)
the transport thread is waiting for data from the server, and that causes the
thread currently trying to send a message to be blocked, and as a result
everything else is blocked
turning on async sending, might only mask the real problem, on why the
transport thread is inside the socketRead0 method, and not data is being
received from the server
when taking thread dumps, always take two of them, otherwise you don't have a reference in time
Filip
jaya_srini wrote:
here's the link
http://www.nabble.com/file/p17221085/thread_dump.txt
thanks
Jaya
Filip Hanik - Dev Lists wrote:
paste it into the email or provide a link to it,
attachment dont make it to the user list
Filip
jaya_srini wrote:
Hi Filip
I have attached the file "thread_dump.txt" that gives the thread-dump.
if you need more info please let me know.
thanks!
jaya
Filip Hanik - Dev Lists wrote:
that is a thread dump for one (1) thread, why don't you post the entire
thread dump for all threads
Filip
jaya_srini wrote:
thanks for the response, Filip!
Thread dump below is what we got on the client side. I'll try and see
if
I
can get a better dump. So what would be the resolution for this? Will
enabling the jms.useAsyncSend property on the connection URI help fix
this
i.e cause the send to be asynchronous so that it doesn't block?
daemon prio=6 tid=0x3793f400 nid=0x1f28 waiting for monitor entry
[0x38aff000..0x38affc98]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1587)
- waiting to lock <0x07c45ea0> (a java.lang.Object)
at
org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:226)
at
org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:268)
at
org.apache.activemq.ActiveMQTopicPublisher.publish(ActiveMQTopicPublisher.java:146)
Filip Hanik - Dev Lists wrote:
as I mentioned, the blocking happens on the mutex for an
ActiveMQSession, the only way you can end up blocking two threads
there,
is if two threads are using the same session,
can you post the complete thread dump?
thanks
Filip
jaya_srini wrote:
So Sorry! :(
I just thought I would explain our scenario in more details.
jaya_srini wrote:
Hello
Apologies for all the questions but I am a newbie to ActiveMQ and I
would
really like to better understand how the ActiveMQ broker works and
was
wondering if someone can explain how it would work for the scenario
below:
I am using single session with 1 producer and 1 consumer (durable
Topic
subscrber) for producing and consuming messages i.e the same session
produces and consumes messages. The session/producer/consumer are
created
in app startup once and are reused through out.
There is a message listener on the consumer for receiving messages
asynchrounously.
Messages are persistent (written to the database) and we are using
the
Publish-Subscribe model.
The client APP (that send and receives the message) and the ActiveMQ
broker are on different machines so I use a TCP transport to
establish
connection with a failover protocol so the connection URI looks like
below
failover:(tcp://<broker_ip>:61616/)
We are using ActiveMq 5.0.0
Given the above info, what is the number of threads created on the
broker
side for sending and dispatching. Will the send and dispatch be
synchronous by default for the above?
If I make the connection URI to be as follows
tcp://<broker_ip>:61616?jms.useAsyncSend=true&jms.dispatchAsync=true
will this cause the send and dispatch to be asynchronous?
We are having some porblem with producer bloacking on
ActiveMQSession.send() with our current set up and I would like to
really
understand what's happening to be able to resolve this.
thank you!
jaya
http://www.nabble.com/file/p17221085/thread_dump.txt thread_dump.txt