What's happening is that you have two brokers with the same name trying to
connect with one another.  The exception throws people off because they
always perceive it mean that it has something to do with their client, which
is not always the case. Whenever you see the "NC_" prefix associated with
this exception it reflects a local or remote bridge between two brokers.  

This is how the clientID is constructed if the broker was trying to set up a
local bridge.  

localClientId = "NC_" + remoteBrokerName + "_inbound" +
configuration.getBrokerName();

And this one if the broker was trying to set up a remote bridge. 

remoteConnectionInfo.setClientId("NC_" + configuration.getBrokerName() +
"_outbound");

In your case, it is a local bridge, but the local and remote broker names
are the same (i.e., localhost). 

Joe
Goto www.ttmsolutions.com for a free ActiveMQ user guide


-----Original Message-----
From: matt hoffman [mailto:[EMAIL PROTECTED] 
Sent: Thursday, May 01, 2008 11:30 AM
To: users@activemq.apache.org
Subject: Help with embedded brokers

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