我试图让单一群集配置只在群集中运行一条消息传递消费者路由(如果它是一个重要的兔子消费者)。
我已经配置了Quartz并且正在使用群集功能,这似乎只适用于只有一个并发执行。
还要注意:我已经考虑过使用SimpleScheduledRoutePolicy和CronRoutePolicy。我看到的问题是我没有找到为石英设置石英端点参数的方法。 (stateful = true,JobName,GroupName等...)。
我在这里做错了吗?我道歉,因为我对骆驼和石英都有点新意。以下是概述我尝试做的事情的路线代码:
SimpleScheduledRoutePolicy policy = new SimpleScheduledRoutePolicy();
long startTime = System.currentTimeMillis() + 3000L;
policy.setRouteStartDate(new Date(startTime));
policy.setRouteStartRepeatCount(-1);
policy.setRouteStartRepeatInterval(10000);
from({consumer.endpoint}}").noAutoStartup().routePolicy(policy).to("log:example?showBody=true&multiline=false");
答案 0 :(得分:0)
也许你的意思是这样的:
protected void calcPersonnelRisk() {
if(questionIndex >(questions.size()-1)){
message.setText("Done");
System.exit(0);
}
//do closing action methods, display total Personnel Risk , end program
else{
yesButton.setVisible(false);
noButton.setVisible(false);
message.setFont(new Font("Tahoma", Font.BOLD, 14));
message.setText(questions.get(questionIndex++));
enterButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int r= Integer.parseInt(textField.getText().trim());
responses.add(r);
textField.setText("");
message.setText(questions.get(questionIndex++));
}});
}
}//end calcPersonnelRisk
答案 1 :(得分:0)
将应用程序限制为一个消息使用者的原因是什么?您添加到Camel路线的每个处理步骤都应该是无状态的 我不确定我是否完全理解您的要求,所以这是一个普遍的暗示。
Camel提供开箱即用的JMS支持,JMS Queues可能就是您所寻找的:
JMS队列
一个暂存区域,其中包含已发送且正在等待读取的消息(仅由一个消费者读取)。与名称队列建议的内容相反,消息不必按照发送顺序接收。只有的JMS队列才能保证每条消息只处理一次。
您的路线可能是:
<route>
<from uri="jms:queue:myqueue" />
<log message="Received message: ${body}" />
<to uri="bean:yourProcessorHere" />
</route>
ActiveMQ也受支持。
答案 2 :(得分:0)
您可能想要使用其他Camel route policy。 Camel支持基于Zookeeper的路由策略(http://camel.apache.org/zookeeper.html)。在这样的解决方案中,Zookeeper将选择活动节点。
如果您不想构建必要的Zookeeper基础架构,您可以滚动自己的路由策略并使用数据库通过让您的节点竞争锁定表行来选择活动节点,看一下here和here的灵感。请注意,代码可能已过时。可能是一个起点。