以下是我的leaderElectionExecutor类,它确保每个应用程序都有一个策展人实例
public class leaderElectionExecutor { private ZookeeperClient zookClient; private static final String leader_NODE = "/testleader"; private static class Holder { static final leaderElectionExecutor INSTANCE = new leaderElectionExecutor(); } public static leaderElectionExecutor getInstance() { return Holder.INSTANCE; } private leaderElectionExecutor() { try { String hostname = Utils.getHostName(); String nodes = "host1:2181,host2:2181; zookClient = new ZookeeperClient(nodes,leader_NODE,hostname); zookClient.start(); // added sleep specifically for the leader to get selected // since I cannot call isleader method immediately after starting the latch TimeUnit.MINUTES.sleep(1); } catch (Exception ex) { // logging error System.exit(1); } } public ZookeeperClient getZookClient() { return zookClient; } }
以下是我的ZookeeperClient代码 –
// can this class be improved in any ways? public class ZookeeperClient { private CuratorFramework client; private String latchPath; private String id; private leaderLatch leaderLatch; public ZookeeperClient(String connString,String latchPath,String id) { client = CuratorFrameworkFactory.newClient(connString,new ExponentialBackoffRetry(1000,Integer.MAX_VALUE)); this.id = id; this.latchPath = latchPath; } public void start() throws Exception { client.start(); leaderLatch = new leaderLatch(client,latchPath,id); leaderLatch.start(); } public boolean isleader() { return leaderLatch.hasleadership(); } public Participant currentleader() throws Exception { return leaderLatch.getleader(); } public void close() throws IOException { leaderLatch.close(); client.close(); } public CuratorFramework getClient() { return client; } public String getLatchPath() { return latchPath; } public String getId() { return id; } public leaderLatch getleaderLatch() { return leaderLatch; } }
现在在我的应用程序中,我正在使用这样的代码 –
public void method01() { ZookeeperClient zookClient = leaderElectionExecutor.getInstance().getZookClient(); if (zookClient.isleader()) { // do something } } public void method02() { ZookeeperClient zookClient = leaderElectionExecutor.getInstance().getZookClient(); if (zookClient.isleader()) { // do something } }
问题陈述:-
在策展人库中 – 调用isleader()在启动锁定后立即不起作用.领导选择需要时间.而且由于这个原因,我已经在我的leaderElectionExecutor代码中添加了1分钟的睡眠,但是我觉得这不是正确的方法.
有没有更好的办法呢?记住这一点,我需要一种方法来检查我是否是领导者,然后执行这段代码.我不能在一个方法中做所有事情,所以我需要调用来自不同类和方法的isleader方法来检查我是否是领导者,然后执行这段代码.
我正在使用Zookeeper 3.4.5和Curator 1.7.1版本.
解决方法
首先,我有我的对象由Spring管理.所以我有一个leaderLatch可以通过容器注入.使用leaderLatch的组件之一是leadershipwatcher,一个Runnable接口的实现,将领导事件发送到其他组件.这些最后一个组件是我命名为leadershipObserver的接口的实现. leadershipwatcher的实现主要是如下代码:
@Component public class leadershipwatcher implements Runnable { private final leaderLatch leaderLatch; private final Collection<leadershipObserver> leadershipObservers; /* constructor with @Inject */ @Override public void run() { try { leaderLatch.await(); for (leadershipObserver observer : leadershipObservers) { observer.granted(); } } catch (InterruptedException e) { for (leadershipObserver observer : leadershipObservers) { observer.interrupted(); } } } }
由于这只是一个草图,我建议您加强此代码,也许应用命令模式调用观察者,甚至将观察者提交到线程池,如果他们的作业阻塞或长时间运行cpu密集型任务.
原文地址:https://www.jb51.cc/java/123553.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。