![](/img/trans.png)
[英]Why does Curator does Leader Election among 'Process' when ZooKeeper has a Leader Election among ZooKeeper Servers?
[英]Calling other nodes in a Curator Leader Election example
以Apache Curator的Example领导者选择器代码为例,在成为领导者时很容易执行一些任务,但是如何在领导者选举过程中将任务分配给其他参与者?
例如,如果节点具有方法
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.