在 Curator Leader Election 示例中调用其他节点

Calling other nodes in a Curator Leader Election example

Apache CuratorExample leader selector code来说,作为leader做一些任务很容易,但是leader选举中如何给其他参与者分配任务进程?

例如,如果节点具有方法

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

我想让leader告诉另一个参与者节点执行工作,我怎么能这样做?

我不会详细说明你应该如何解决这个问题,而是给出一个粗略的例子来说明如何解决这个问题。让我们首先向 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() ,我们将有一个 class 工作直到它成为领导者然后停止。

要从领导者启动和停止其他节点,我建议看一下 'message passing' 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();

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

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