采用 Apache Curator 的Example leader selector code,作为领导者可以轻松执行某些任务,但我们如何在领导者选举过程中向其他参与者提供任务?
例如,如果节点具有方法
void doWork(){
System.out.println(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();
领导者会让其他节点做一些工作。
这不是最好的方法,但我认为这是一个良好的开端,也是你可以改进和学习的东西。