I'm having a lot of trouble getting embedded brokers to work as they
should.  I'm using them in my case mainly to ease configuration -- I want to
be able to run several instances of the same code and have them discover
each other and communicate, without needing a single server already running.


The current problem is, the first server starts up great, and works as
expected.  Subsequent servers, though, throw this error:

javax.jms.InvalidClientIDException: Broker: localhost - Client:
NC_localhost_inboundlocalhost already connected from vm://localhost#0

Which seems strange, seeing as how I'm not explicitly setting clientID
anywhere.  I thought these were auto-generated?

Below is the configuration I'm currently using.  I'm not referencing the
broker in code at all; I'm interacting with it only through the Spring
JmsTemplate, which in turn gets a connection from the
ActiveMQConnectionFactory connecting to vm://localhost.  Based on the
documentation, that seems to be the way to do it... what have I
misunderstood?


In my Spring config:

    <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
        <property name="config" value="classpath:activemq.xml" />
        <property name="start" value="true" />
    </bean>

    <bean id="workQueueDestination"
class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="Test.WorkQueue"/>
    </bean>

    <bean id="eventTopicDestination"
class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg index="0" value="Test.EventTopic"/>
    </bean>

    <bean id="jmsFactory"
class="org.apache.activemq.ActiveMQConnectionFactory" depends-on="broker">
        <property name="brokerURL" value="vm://localhost"/>
    </bean>

    <bean id="workQueueJmsTemplate"
class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory">
            <!-- wrapping in a pool to avoid creating a connection per send
-->
            <bean
class="org.springframework.jms.connection.CachingConnectionFactory">
                <property name="targetConnectionFactory">
                    <ref local="jmsFactory"/>
                </property>
            </bean>
        </property>

        <property name="defaultDestination" ref="workQueueDestination"/>
    </bean>

I previously tried including the broker config directly in the Spring file,
but broke it out as a problem-solving exercise and haven't moved it back
yet.
Here's the referenced activemq.xml:


<beans xmlns="http://www.springframework.org/schema/beans";
       xmlns:jms="http://activemq.org/config/1.0";
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://activemq.org/config/1.0
http://activemq.apache.org/schema/core/activemq-core-5.0.0.xsd";
       default-lazy-init="false">

    <jms:broker id="broker" persistent="false" useJmx="true">
        <jms:networkConnectors>
            <jms:networkConnector uri="multicast://default" duplex="true"/>
            <!-- by default just auto discover the other brokers -->
        </jms:networkConnectors>

        <jms:persistenceAdapter>
            <jms:memoryPersistenceAdapter/>
        </jms:persistenceAdapter>

        <jms:transportConnectors>
            <jms:transportConnector name="openwire" uri="tcp://localhost:0"
discoveryUri="multicast://default"/>
        </jms:transportConnectors>

    </jms:broker>

</beans>

Reply via email to