Java 在策展人领导人选举示例中调用其他节点

Java 在策展人领导人选举示例中调用其他节点,java,apache,apache-zookeeper,apache-curator,Java,Apache,Apache Zookeeper,Apache Curator,以Apache策展人为例,当领导者时,执行某些任务很容易,但是我们如何在领导者选举过程中将任务分配给其他参与者呢 例如,如果节点具有该方法 void doWork(){ System.out.println(1); } 我想让负责人告诉另一个参与者节点执行工作,我该怎么做?我将不详细介绍您应该如何解决这个问题,而是给出一个如何完成的粗略示例。让我们首先向ExampleClient添加一个方法,该方法在新线程中执行一些工作 public boolean active; public void

以Apache策展人为例,当领导者时,执行某些任务很容易,但是我们如何在领导者选举过程中将任务分配给其他参与者呢

例如,如果节点具有该方法

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

我想让负责人告诉另一个参与者节点执行工作,我该怎么做?

我将不详细介绍您应该如何解决这个问题,而是给出一个如何完成的粗略示例。让我们首先向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()中,我们将有一个类一直工作到它成为leader然后停止

要启动和停止其他节点,我建议查看“消息传递”,但我再次给出了一种粗略的方法:

如果我们将此添加到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();
    }
    ...
引线将使其他节点执行一些工作


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

你能再解释一下你真正想做的事情吗?我们也许能帮你找到实现这一目标的方法。你希望领导者分发任务,还是希望其他节点在不担任领导者的情况下做背景工作?我希望这两种可能性都有,如果领导者可以明确地调用其他节点来做一些工作,那将是完美的。我想要的是:n个节点(同一类Java)参与了策展人LeaderSection,当其中一个节点带头时,其他节点保持活动状态,领导者可以向他们传递命令(因此,当一个节点带头时,我希望有一个主/工作者模型)。因此,我们必须在doWork()中启动另一个线程?我正在考虑其他的选择,比如在有新任务时使用监听器和创建一些znode,使用或这样做。你建议在Zookeeper中更进一步,而不是使用策展人配方吗?如果你从另一个ExampleClient中调用它作为一种方法,如果你想让它们并排工作,你必须启动一个线程。我建议使用Curator而不是raw Zookeeper。我还有最后一个问题:我希望每个进程运行一个客户端,最明显的解决方案是更新列表,即执行
private static list examples=Lists.newArrayList()您是否有其他方法来代替创建静态列表?鉴于您引用的示例代码,我无法回答这个问题。将列表示例设置为静态不会改变示例的执行,因为列表仅在main方法中使用。
examples.add(example);
example.nodes = examples;   //New line
client.start();
example.start();