Hello,

I'm trying to write code for a webapp which allows me to start and stop the
webapp no matter whether an ActiveMQ JMS server is running or not with
ActiveMQ 4.1.1. This means:

- Create the connection in a worker thread, so the webapp doesn't hang
during startup
- Interrupt the connection creation and kill the worker thread at shutdown
time if the server never came up

This works until the point when I have to shutdown the worker. In this
situation, we have two threads: Worker and Main. Everything happens in
ActiveMQConnection.

Worker hangs in ensureConnectionInfoSent() in syncSendPacket(), waiting for
the server to come up. Note that ensureConnectionInfoSent() is synchronized;
the connection is the lock object.

Main tries to stop the ActiveMQ client and calls "close()" on the
connection. close() calls checkClosed() which is also synchronized on the
connection object. This creates a deadlock since Worker won't release the
lock any time soon.

Is there a reason why checkClosed() is synchronized? It's only using a
AtomicBoolean and possibly throwing an exception. The next obstacle would be
checkClosedOrFailed() which is also synchronized. Again, I see no obvious
reason why it has to be.

Unfortunately, then I run into a wall. stop() also wants to synchronize on
the connection.

My next idea was to interrupt the Worker thread. This doesn't work but
creates an endless loop in FailoverTransport.oneway() (the inner while()
loop isn't terminated on InterruptedException).

So all in all, I see no way to create an ActiveMQConnection in a worker
thread and reliably stop the thread at shutdown of the webapp (*not* the
VM).

Has anyone solved this problem or do you just accept that your webapps hang
when the JMS server is not around?

Regards,

-- 
Aaron Digulla
-- 
View this message in context: 
http://www.nabble.com/Reliably-starting-and-stopping-of-a-producer-consumer-tf4600635s2354.html#a13135407
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to