繁体   English   中英

在馆长选举示例中调用其他节点

[英]Calling other nodes in a Curator Leader Election example

Apache CuratorExample领导者选择器代码为例,在成为领导者时很容易执行一些任务,但是如何在领导者选举过程中将任务分配给其他参与者?

例如,如果节点具有方法

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(),我们将拥有一个可以工作的类,直到它成为领导者,然后停止。

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

领导者将使其他节点做一些工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM