在策展人领导者选举示例

时间:2016-02-23 16:25:04

标签: java apache apache-zookeeper apache-curator

采用 Apache Curator Example leader selector code,作为领导者可以轻松执行某些任务,但我们如何在领导者选举过程中向其他参与者提供任务?

例如,如果节点具有方法

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

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

1 个答案:

答案 0 :(得分: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()添加到takeadership(),我们将会有一个有效的类,直到它成为leader,然后停止。

要启动和停止来自领导者的其他节点,我建议您查看一下“'消息传递' 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();

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

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