Over the past days, I worked on improving the connection pooling in
ActiveMQ, mainly for outbound.  I found that:
 * the o.a.a.pool package has a limited throughput when using persistence
    messaging, because all threads reuse a single connection, but the broker
    will handle the messages sequentially, so the throughput of using a single
    transaction in multiple threads is the same as using a single thread.
* the activemq resource adapter used for outbound is really slow (using
   jencks), because the connection is completely reset after each use.  The
    connection infos need to be sent each time + creation of an
advisory consumer
    on the connection, + createion of the session + creation of a
producer.  These
   operations are very cpu intensive on the broker side (no real idea
why).  I think
   this should be improved by pooling sessions / producers.

For my current needs, I have enhanced the o.a.a.pool package to support
enlisting the current session in an active xa transaction, and by allowing
several connections to be used to raise the global throughput.
I have also added in jencks a derived pooled connection factory which
is compatible with jencks jca inbound support (the main problem is that
the XAResource#isSameRM need to work and recognize that the inbound
connection and outbound connection use the same RM).

My last thought is that i wonder if the org.apache.activemq.pool package
should be in its own module because it has its own set of dependencies
in addition to the standard jms client (commons-pool mainly) which can
lead to problems with classloaders.

--
Cheers,
Guillaume Nodet

Reply via email to