0

Apache CuratorLeader selector 示例代码为例,在担任 Leader 的同时执行一些任务很容易,但是我们如何在 Leader 选举过程中将任务分配给其他参与者呢?

例如,如果一个节点有方法

void doWork(){
  System.out.println(1);
}

我想让领导告诉这个其他参与者节点执行工作,我该怎么做?

4

1 回答 1

0

我不会详细说明你应该如何解决这个问题,而是给出一个粗略的例子来说明它是如何完成的。让我们首先向 ExampleClient 添加一个在新线程中执行某些工作的方法。

public boolean active;
public void doWork(){
    active = true;
    new Thread(new Runnable() {         
        @Override
        public void run() {
            while(active){
                System.out.println("Working");
            }
        }
    }).start();
}
public void stopWork(){
    active = false;
}

现在您可以在您可能拥有的任何 ExampleClient 对象上调用 doWork,它会开始工作,要停止它,您可以调用 stopWork。如果我们将 doWork() 添加到 start() 并将 stopWork() 添加到 takeLeadership(),我们将有一个类一直工作,直到它成为领导者然后停止。

要从领导者开始和停止其他节点,我建议看一下“消息传递” https://en.wikipedia.org/wiki/Message_passing但我再次给你一个粗略的方法:

如果我们将其添加到 ExampleClient:

public List<ExampleClient> nodes;
@Override
public void takeLeadership(CuratorFramework client) throws Exception
{
    // we are now the leader. This method should not return until we want to relinquish leadership
    for(ExampleClient e : nodes){
      if(this != e)
        e.doWork();
    }
    ...

这就是 LeaderSelectorExample:

examples.add(example);
example.nodes = examples;   //New line
client.start();
example.start();

领导者会让其他节点做一些工作。

这不是最好的方法,但我认为这是一个好的开始,你可以改进和学习。

于 2016-02-24T14:25:36.150 回答