在 Curator Leader Election 示例中调用其他节点
Calling other nodes in a Curator Leader Election example
拿Apache Curator的Example leader selector code来说,作为leader做一些任务很容易,但是leader选举中如何给其他参与者分配任务进程?
例如,如果节点具有方法
void doWork(){
System.out.println(1);
}
我想让leader告诉另一个参与者节点执行工作,我怎么能这样做?
我不会详细说明你应该如何解决这个问题,而是给出一个粗略的例子来说明如何解决这个问题。让我们首先向 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() ,我们将有一个 class 工作直到它成为领导者然后停止。
要从领导者启动和停止其他节点,我建议看一下 'message passing' 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();
领导者会让其他节点做一些工作。
这不是最好的方法,但我认为这是一个好的开始,是您可以改进和学习的地方。
拿Apache Curator的Example leader selector code来说,作为leader做一些任务很容易,但是leader选举中如何给其他参与者分配任务进程?
例如,如果节点具有方法
void doWork(){
System.out.println(1);
}
我想让leader告诉另一个参与者节点执行工作,我怎么能这样做?
我不会详细说明你应该如何解决这个问题,而是给出一个粗略的例子来说明如何解决这个问题。让我们首先向 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() ,我们将有一个 class 工作直到它成为领导者然后停止。
要从领导者启动和停止其他节点,我建议看一下 'message passing' 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();
领导者会让其他节点做一些工作。
这不是最好的方法,但我认为这是一个好的开始,是您可以改进和学习的地方。