以Apache Curator的Leader selector 示例代码为例,在担任 Leader 的同时执行一些任务很容易,但是我们如何在 Leader 选举过程中将任务分配给其他参与者呢?
例如,如果一个节点有方法
void doWork(){
System.out.println(1);
}
我想让领导告诉这个其他参与者节点执行工作,我该怎么做?
以Apache Curator的Leader selector 示例代码为例,在担任 Leader 的同时执行一些任务很容易,但是我们如何在 Leader 选举过程中将任务分配给其他参与者呢?
例如,如果一个节点有方法
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();
领导者会让其他节点做一些工作。
这不是最好的方法,但我认为这是一个好的开始,你可以改进和学习。