-2

我想在使用 Hazelcast 的集群中彼此共享的两个实例中运行 java 任务。这样,任务可以更快地完成,而不是在单个实例中运行。请帮忙!

4

1 回答 1

2

从您发布的问题中,您的问题不是很清楚。你的大任务可能是做以下事情之一。

  1. 处理存储在 hazelcast 分布式数据结构中的数据(数据密集型)。
  2. 来自 hazelcast 的数据有限或没有数据的数字运算(CPU 密集型)操作。

在这两种情况下,您都可以在 hazelcast 中使用 ExecutorService 的分布式实现。请参阅以下链接:

http://docs.hazelcast.org/docs/3.5/javadoc/com/hazelcast/core/IExecutorService.html

对于案例 1),由于 hazelcast 将数据划分为多个节点(实例),因此您可以通过调用 executeOnKeyOwner() 方法在密钥所有者上执行任务,如下所示。

示例代码

    HazelcastInstance hz = Hazelcast.newHazelcastInstance();
    Map<Integer, String> map = hz.getMap("yourMap");
    for (int key = 0; key < 100; key++)
        map.put(key, "someValue");
    IExecutorService executor = hz.getExecutorService("executor");
    for (Integer key : map.keySet())
        executor.executeOnKeyOwner(new YourBigTask(), key);

YourBigTask 是您的“大任务类”,将在 run() 方法中实现Runnable和接口并进行必要的处理。Serializable如果您需要在内部使用 hzinstance run(),也请实施HazelcastInstanceAware

对于案例 2)你可以打电话

    executor.executeOnAllMembers(new YourBigTaskClass()); 

这将在所有已知的集群成员上执行您的任务。

希望这可以帮助。我仍然鼓励您查看其他方法,IExecutorService并以最佳方式使用最适合您问题的方法。

于 2015-09-26T09:07:58.870 回答