Apache camel 服务混合的路由队列

Apache camel 服务混合的路由队列,apache-camel,activemq,apache-servicemix,Apache Camel,Activemq,Apache Servicemix,我正在尝试配置Apache ServiceMix以实现以下网络拓扑: <broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false"> <destinationPolicy> <policyMap> &

我正在尝试配置Apache ServiceMix以实现以下网络拓扑:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>
我对服务组合、Camel、ActiveMq等方面非常陌生,我试图解决的主要问题是将消息从DC1.ActiveMqBroker的输出队列路由到DC2.ActiveMqBroker的输入队列

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>
我相信这应该很容易。有人能给我指出这篇好文章或是写一段粗略的配置片段吗(在Spring/Blueprint中,没关系)

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>
更新:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>
很抱歉发了这么长的短信,但我看不到其他方法来说明我的问题

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>
我的示例配置:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>

我假设您已经掌握了如何在ServiceMix中启动Camel,并且有一些(至少)概念验证路线。。如果没有。还假设您知道这两个消息代理的URL,并且它们已经设置好了

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>
因此,一种解决方案是注册两个ActiveMQComponents:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>
<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
   <property name="brokerURL" value="tcp://DC1BrokerLocation:12345" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
   <property name="brokerURL" value="tcp://DC2BrokerLocation:12345" />
</bean>

然后在您的骆驼环境中:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dc2" dataDirectory="${karaf.data}/activemq/dc2" useShutdownHook="false">
    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry queue="input" producerFlowControl="true" memoryLimit="1mb"/>
                <policyEntry queue="output" producerFlowControl="true" memoryLimit="1mb"/>
            </policyEntries>
        </policyMap>
    </destinationPolicy> 
    <managementContext>
        <managementContext createConnector="false"/>
    </managementContext>
    <persistenceAdapter>
        <kahaDB directory="${karaf.data}/activemq/dc2/kahadb"/>
    </persistenceAdapter>
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61619"/>
    </transportConnectors>
</broker>

<bean id="dc1activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61619" />
</bean>

<bean id="dc2activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61618" />
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route>
        <from uri="dc1activemq:queue:output"/>
        <log message="Took message from dc1 to dc2"/>
        <to uri="dc2activemq:queue:input"/>
    </route>
</camelContext>
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
   <route>
      <from uri="dc1activemq:queue:whateverTheOutQueueIsCalled"/>
      <log message="Took message from dc1 to dc2"/>
      <to uri="dc2activemq:queue:whateverTheInQueueIsCalled"/>
   </route>
   <route>
      <from uri="dc2activemq:queue:whateverTheOutQueueIsCalled"/>
      <log message="Took message from dc2 to dc1"/>
      <to uri="dc1activemq:queue:whateverTheInQueueIsCalled"/>
   </route>
<camelContext>


谢谢Roy,我以前尝试过你的解决方案(我认为我做错了)。但你证实了我是对的。请在更新的问题中查看更精确的错误。嗨,Pashec,不幸的是,我们开始进入一个我不太熟悉的地方-使用元素设置活动MQ。从错误中可以清楚地看出,您的代理没有运行,但我不知道为什么。如果你不能弄明白这一点,可能值得再创造一个奎斯蒂诺