我一直在关注WSO2任务执行,似乎可以为任务执行设置简单的计划(例如使用类似cron的计划)。但是,我如何确保在群集中每个群集只调度一次任务,而不是每个节点调度一次?
答案 0 :(得分:1)
您可以使用WSO2 ESB Scheduled任务的“pinnedServers”属性来实现此目的。
在计划任务中,您将在创建计划任务时看到pinnedServers属性。
此pinnedServers属性的用途是限制在群集环境中部署计划任务。
您可以在要部署计划任务的群集环境中提供WSO2 ESB实例的主机名列表(以“,”分隔),并且计划任务将仅部署在那些WSO2 ESB实例上。
因此,在您的情况下,您可以在群集环境中指定其中一个WSO2 ESB实例的主机名,而计划任务将仅部署在该WSO2 ESB实例中,因此每个WSO2 ESB群集仅部署一次。
确保使用各自的主机名修改WSO2 ESB实例的axis2.xml中的“SynapseConfig.ServerName”参数。
E.g:
<parameter locked="false" name="SynapseConfig.ServerName">host1.wso2.org</parameter>
谢谢和问候,
Harshana
答案 1 :(得分:1)
wso2 ESB 4.9.0(即将发布)支持此功能。但是对于早期版本,您可以使用基于Hazelcast领导节点的变通方法。
<script language="js">
importPackage(Packages.com.hazelcast.core);
importPackage(Packages.java.util);
iter = Hazelcast.getAllHazelcastInstances().iterator();
if( iter.hasNext() ) {
instance = iter.next();
isLeader = instance.getCluster().getMembers().iterator().next().localMember();
mc.setProperty("isLeader", isLeader);
} else {
mc.setProperty("isLeader", "true");
}
</script>
可以找到更多详细信息here
在代理服务或序列中,您只能在领导节点中执行任务。将消息放在其他节点上。计划任务将在所有节点上执行,但序列或代理服务中写入的实际任务将仅在一个节点中执行。此方法可以处理节点崩溃新节点添加和删除到群集。