WSO2在集群中执行单个任务

时间:2012-11-26 16:44:01

标签: cluster-computing task wso2

我一直在关注WSO2任务执行,似乎可以为任务执行设置简单的计划(例如使用类似cron的计划)。但是,我如何确保在群集中每个群集只调度一次任务,而不是每个节点调度一次?

2 个答案:

答案 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

在代理服务或序列中,您只能在领导节点中执行任务。将消息放在其他节点上。计划任务将在所有节点上执行,但序列或代理服务中写入的实际任务将仅在一个节点中执行。此方法可以处理节点崩溃新节点添加和删除到群集。