在嵌入式 Camel 路由中,我有一个远程 JMS 队列的持久消费者。是否可以通过主从配置进行这种路由?现在看来,Camel 路由在从 ActiveMQ 启动时已经启动和激活,而不是在实际故障转移发生时。
现在它会导致从属实例接收发送给主实例的相同消息,这会导致重复消息在故障转移时到达队列。
我正在使用 ActiveMQ 5.3 和 Apache Camel 2.1。
在嵌入式 Camel 路由中,我有一个远程 JMS 队列的持久消费者。是否可以通过主从配置进行这种路由?现在看来,Camel 路由在从 ActiveMQ 启动时已经启动和激活,而不是在实际故障转移发生时。
现在它会导致从属实例接收发送给主实例的相同消息,这会导致重复消息在故障转移时到达队列。
我正在使用 ActiveMQ 5.3 和 Apache Camel 2.1。
不幸的是,当从代理启动时,CamelContext 以及路由也会启动。但是,您可以通过执行以下操作来完成此操作:
在使用从代理部署的 camelContext 上,添加以下 autoStartup 属性以防止路由启动:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" autoStartup="false">
...
</camelContext>
接下来,您需要创建一个实现 ActiveMQ 服务接口的类。示例如下:
package com.fusesource.example;
import org.apache.activemq.Service;
import org.apache.camel.spring.SpringCamelContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Example used to start and stop the camel context using the ActiveMQ Service interface
*
*/
public class CamelContextService implements Service
{
private final Logger LOG = LoggerFactory.getLogger(CamelContextService.class);
SpringCamelContext camel;
@Override
public void start() throws Exception {
try {
camel.start();
} catch (Exception e) {
LOG.error("Unable to start camel context: " + camel);
e.printStackTrace();
}
}
@Override
public void stop() throws Exception {
try {
camel.stop();
} catch (Exception e) {
LOG.error("Unable to stop camel context: " + camel);
e.printStackTrace();
}
}
public SpringCamelContext getCamel() {
return camel;
}
public void setCamel(SpringCamelContext camel) {
this.camel = camel;
}
}
然后在 broker 的配置文件 activemq.xml 中添加以下内容来注册服务:
<services>
<bean xmlns="http://www.springframework.org/schema/beans" class="com.fusesource.example.CamelContextService">
<property name="camel" ref="camel"/>
</bean>
</services>
现在,一旦从代理接管为主代理,将在服务类上调用 start 方法并启动路由。
我还在这里发布了一篇关于此的博客:http: //jason-sherman.blogspot.com/2012/04/activemq-how-to-startstop-camel-routes.html
这应该不是问题,因为从属设备上的 Camel 上下文/路由在成为主设备之前不会启动(当主设备释放消息存储文件锁时)
With camel routepolicies you can decide to suspend/resume certain routes based on your own conditions. http://camel.apache.org/routepolicy.html
There is an existing ZookeeperRoutePolicy that can be used to do leader election. http://camel.apache.org/zookeeper.html (see bottom of the page)