activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mario Siegenthaler" <mario.siegentha...@gmail.com>
Subject Re: Sharing embedded broker across webapp contexts
Date Mon, 18 Jun 2007 19:56:38 GMT
I just played around with it a little: The easiest syntax is:

    <Resource
        name="jms/ConnectionFactory"
        auth="Container"
        type="org.apache.activemq.ActiveMQConnectionFactory"
        description="JMS Connection Factory"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory"
        brokerURL="vm://localhost?brokerConfig=xbean:activemq.xml"
        />

alternative is
        brokerURL="vm://localhost?brokerConfig=xbean:file:./activemq.xml"
depending on whether you want the configuration xml within or outside
the classpath.

You can also configure your broker using the Broker-URI format (see
http://activemq.apache.org/broker-uri.html)

You'll have to make sure you got the right jars inside your
common/lib, especially when using the xml-configuration file, but else
it should work just fine.


Mario


On 6/18/07, uma_rk@comcast.net <uma_rk@comcast.net> wrote:
>
> Mario,
>
> How do I specify the network connector in the JNDI configuration?
> Is there a way to point Tomcat to the xbean configuration for the broker
> instead of replicating the configuration element by element? I use the
> xbean config file to specify the JMX configuration, ceiling on the memory footprint,
> the destination policies and finally the network connectors.
>
>        <Resource
>                 name="jms/ConnectionFactory"
>                 auth="Container"
>                 type="org.apache.activemq.ActiveMQConnectionFactory"
>                 description="JMS Connection Factory"
>                 factory="org.apache.activemq.jndi.JNDIReferenceFactory"
>                 brokerURL="tcp://localhost:61616"
>                 brokerName="MyBroker"
>        />
>
> Could someone point me to a complete JNDI configuration for an embedded broker?
> The activemq site has a lot of  fragments of useful nuggets but I am unable to find a
> full configuration for examples...
>
> Regards
>
> /U
>
>
>
>  -------------- Original message ----------------------
> From: uma_rk@comcast.net
> >
> > Mario,
> >
> > Thanks for the explanation.  If I incorporate the JNDI configuration of amq,
> > would Tomcat automatically start the broker? I need to create an embedded
> > broker with network connectors. If I specify xbean configuration in JNDI,
> > would Tomcat automatically create the broker and issue broker.start()?
> >
> > Thanks,
> >
> > /U
> >
> >  -------------- Original message ----------------------
> > From: "Mario Siegenthaler" <mario.siegenthaler@gmail.com>
> > > I think the easiest way would be to use a broker that is started by
> > > tomcat. This can be done using JNDI-configurations in the tomcats
> > > server.xml (see http://activemq.apache.org/tomcat.html).
> > > To connect to the broker you can either get the connection-factory via
> > > JNDI (standard way) or just make a new ActiveMQ connection factory
> > > pointing to vm://localhost (or whatever you named your broker).
> > > You'll need to put the active-mq jar into the common/lib (or into the
> > > server/lib if you only use jms-api functions and have the jms api with
> > > common/lib) of your tomcat. Also you have to make sure that you don't
> > > include a jms-api or activemq-jar in your war as that would cause the
> > > feared ClassCastException.
> > >
> > > If you don't like the way I described above then you can also just put
> > > the AMQ-jar in the common/lib (and not in any of the webapps) and
> > > create the connection factory in each webapp for vm://localhost. This
> > > will bring up a broker if there isn't already one running, so I
> > > doesn't matter which webapp starts first. You'll not need any special
> > > setup code. However I'm not sure where I'd put the activemq.xml
> > > configuration file in that case.
> > >
> > > However I'd strongly recommend the first proposal, since it seems more
> > > controllable and easier to configure.
> > >
> > > To your point 2: The class is serialized when it's passed around by
> > > the broker (except you turn it off, of course only possible in the
> > > vm-protocol). So you'll just have to make sure the thing is compatible
> > > and you can put the jar X's in into both webapps and you don't need it
> > > to put into common/lib.
> > >
> > > 3) No, I don't see any (technical) reason. However I'd recommend to
> > > 'inject' the connection factory into the webapp, so the webapp is
> > > completely agnostic to whether the broker is embedded or not. Else
> > > you'll have more trouble moving them around.
> > >
> > > Mario
> > >
> > > On 6/18/07, uma_rk@comcast.net <uma_rk@comcast.net> wrote:
> > > >
> > > > I am using activemq 4.1.1 on JDK6 with Tomcat 5.5.x.
> > > >
> > > > I have a couple of webapp contexts in a servlet container that use activemq
> > > broker.
> > > > I have been using an external broker but would like to embed the broker
in
> > the
> > > > servlet container. I have the following questions.
> > > >
> > > > 1) Assume I have webapps A and B. Is it necessary that only one of the
two
> > > webapps
> > > >    assume the responsibility of starting the broker? I mean, I would like
to
> > > embed the
> > > >   starting of the broker in a jarfile that is shared by both the webapps.
> > Its
> > > hence easy for me
> > > >   to keep the jarfile agnostic to which webapp its operating in and execute
> > > the broker start code
> > > >   at context startup.
> > > >
> > > >   Stated simply, would this sequence cause two different brokers to attempt
> > to
> > > start?
> > > > Should I build mechanisms to make sure the broker.start() is executed
only
> > > once?
> > > >
> > > >      Webapp A:
> > > >             context load { // Time t
> > > >                  Broker broker = new broker("tcp://localhost:61616");
> > > //pseudocode
> > > >                  broker.start();
> > > >             }
> > > >
> > > >         Webapp B:
> > > >             context load { // Time t + 5
> > > >                  Broker broker = new broker("tcp://localhost:61616");
> > > //pseudocode
> > > >                  broker.start();
> > > >             }
> > > >
> > > > 2) Assume webapp A starts the broker. Also, let's say Class X is defined
in
> > a
> > > jarfile
> > > >   common to both the webapps.
> > > >
> > > >    Would this cause class cast exception if webapp B received an instance
of
> > > class X
> > > >    from the broker? (since I assume the broker would use the webapp A
> > > classloader
> > > >    to load class X)?
> > > >
> > > >    If so how do I avoid this class loading issue? Do I need to place the
> > > activemq jarfiles
> > > >    as well as the application jarfiles which contains classes of the
> > messages
> > > dispatched
> > > >    over activemq to be in a shared system classpath common to both the
> > webapp
> > > contexts?
> > > >
> > > > 3) In a setup such as this where multiple webapps share the same embedded
> > > broker,
> > > >    is it mandatory that they use an external broker?
> > > >
> > > >     What are the other gotchas in using the embedded broker in this fashion?
> > > >
> > > > Regards
> > > >
> > > > /U
> > > >
> >
>
>

Mime
View raw message