0

我一直在研究 WSO2 任务执行,似乎可以为任务执行设置简单的时间表(例如,使用类似 cron 的时间表)。但是,我如何确保在集群中任务仅在每个集群上安排一次,而不是在每个节点上安排一次?

4

2 回答 2

1

您可以使用 WSO2 ESB 计划任务的“pinnedServers”属性来实现这一点。

在您的计划任务中,您将在创建计划任务时看到 pinnedServers 属性。

此 pinnedServers 属性的目的是限制集群环境中计划任务的部署。

您可以在要部署计划任务的集群环境中提供 WSO2 ESB 实例的主机名列表(由“,”分隔),并且计划任务将仅部署在那些 WSO2 ESB 实例上。

因此,在您的情况下,您可以指定集群环境中 WSO2 ESB 实例之一的主机名,并且计划任务将仅部署在该 WSO2 ESB 实例中,因此每个 WSO2 ESB 集群仅部署一次。

确保使用各自的主机名修改 WSO2 ESB 实例的 axis2.xml 中的“SynapseConfig.ServerName”参数。

例如:

<parameter locked="false" name="SynapseConfig.ServerName">host1.wso2.org</parameter>

谢谢并恭祝安康,

哈沙娜

于 2012-12-01T11:50:17.260 回答
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>

更多细节可以在这里找到

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

于 2015-09-07T05:03:50.617 回答