Apache camel 服务混合的路由队列
我正在尝试配置Apache ServiceMix以实现以下网络拓扑: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> &
<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。从错误中可以清楚地看出,您的代理没有运行,但我不知道为什么。如果你不能弄明白这一点,可能值得再创造一个奎斯蒂诺