curator实现分布式任务调度
来源:互联网 发布:mysql数据库基本语句 编辑:程序博客网 时间:2024/05/08 13:39
public interface ClusterLeaderListener { public void gainLeader(); public void loserLeader();}
public interface ClusterManager {/** * 获取leader节点 * @throws Exception */void acquireLeader() throws Exception;/** * 关闭leader选举 * @throws Exception */void closeLeaderLatch() throws Exception;/** * 开始leader选举 * @throws Exception */void startLeaderLatch() throws Exception;/** * 添加监听器 * @throws Exception */void addLeaderListener(ClusterLeaderListener listener) throws Exception;}
/** * 连接zookeeper服务器,leader选举 * @author hao.wang 2017年1月18日 下午5:29:44 * */public class ZookeeperClusterManager implements ClusterManager{ private CuratorFramework framework; private LeaderLatch leaderLatch; private static List<ClusterLeaderListener> listeners = new ArrayList<ClusterLeaderListener>(); private volatile boolean isLeaderLatchStart = false; private static final String DETAULE_ELECTION_PATH = "/election/demo/hao"; public ZookeeperClusterManager() { framework= CuratorFrameworkFactory.newClient("139.199.182.26:5000",30000,5000, new ExponentialBackoffRetry(2000,Integer.MAX_VALUE)); framework.start(); leaderLatch = new LeaderLatch(framework, DETAULE_ELECTION_PATH); try { leaderLatch.start(); } catch (Exception e) { e.printStackTrace(); } isLeaderLatchStart = true; leaderLatch.addListener(new LeaderLatchListener() { @Override public void notLeader() { synchronized(this){ if(!listeners.isEmpty()){ for (ClusterLeaderListener listener : listeners) { listener.loserLeader(); } } } } @Override public void isLeader() { synchronized(this){ if(!listeners.isEmpty()){ for (ClusterLeaderListener listener : listeners) { listener.gainLeader(); } } } } }); } @Override public void acquireLeader() throws Exception { this.leaderLatch.await(); } @Override public void closeLeaderLatch() throws Exception { this.leaderLatch.close(); } @Override public void startLeaderLatch() throws Exception { if(!isLeaderLatchStart){ this.leaderLatch.start(); } } @Override public void addLeaderListener(ClusterLeaderListener listener) throws Exception { if(!this.listeners.contains(listener)){ listeners.add(listener); } }}
public interface SchedulerBootstrap { void start() throws Exception; void stop() throws Exception;}
public class SchedulerBootstrapImpl implements SchedulerBootstrap { private String serverName; private ClusterManager clusterManager = new ZookeeperClusterManager(); private volatile boolean shutDown = false; public SchedulerBootstrapImpl(String serverName) { this.serverName = serverName; } @Override public void start() throws Exception { if (shutDown) { throw new RuntimeException("任务已经停止"); } boolean leaderAcuqire = false; // 这个过程就是获取leader权限 while (!Thread.currentThread().isInterrupted()) { try { clusterManager.acquireLeader(); leaderAcuqire = true; break; } catch (Exception e) { if (e instanceof InterruptedException) { Thread.currentThread().interrupt(); return; } if (shutDown) { return; } Thread.sleep(5000); } } System.out.println(serverName + "获得处理权力,开始执行任务"); if (leaderAcuqire) { startService(); } clusterManager.addLeaderListener(new ClusterLeaderListener() { @Override public void gainLeader() { // 获得leader权力,执行任务 startService(); } @Override public void loserLeader() { // 丢失leader权力,关闭任务 destoryService(); } }); } @Override public void stop() throws Exception { destoryService(); shutDown = true; } private void startService() { SchedulerService.startTimer(serverName); try { clusterManager.startLeaderLatch(); } catch (Exception e) { SchedulerService.stopTimer(serverName); try { clusterManager.closeLeaderLatch(); } catch (Exception e1) { e1.printStackTrace(); } } } private void destoryService() { SchedulerService.stopTimer(serverName); try { clusterManager.closeLeaderLatch(); } catch (Exception e) { e.printStackTrace(); } }}
public class SchedulerService { static ScheduledExecutorService service = Executors.newScheduledThreadPool(10); public static void startTimer(final String serverName){ service.scheduleAtFixedRate(()->{ System.out.println("我是服务器"+serverName +",开始已执行任务"); }, 5,1, TimeUnit.SECONDS); } public static void stopTimer(final String serverName){ System.out.println("我是服务器:"+serverName+",停止执行任务"); service.shutdown(); }}
public class App1 { public static void main(String[] args) { SchedulerBootstrap sb = new SchedulerBootstrapImpl("服务1"); try { sb.start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}public class App2 { public static void main(String[] args) { SchedulerBootstrap sb = new SchedulerBootstrapImpl("服务2"); try { sb.start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
0 0
- curator实现分布式任务调度
- 分布式任务调度实现方式
- redis 实现 curator 分布式锁
- 五.Curator实现分布式锁
- 项目 分布式 任务调度
- 一步一步分布式任务调度
- Lts分布式任务调度
- 分布式任务调度解决方案
- curator实现zookeeper的分布式锁
- Curator链接zookeeper实现分布式锁
- 分布式任务调度系统分析(tbschedule)
- clover分布式任务调度系统
- 分布式任务调度中间件SchedulerX
- clover分布式任务调度系统
- 分布式定时任务调度系统
- 分布式任务调度平台Antares
- 分布式任务调度xxl-job
- elasticjob分布式任务调度中间件
- 空文件夹扫描工具(有缺陷)
- JS圆
- day11--定时器管理、函数封装
- 为什么说传统分布式事务不再适用于微服务架构?
- jboss启动一直报数据库无法连接错误,检查配置均无误
- curator实现分布式任务调度
- 使用java mail来发送邮件(带图片)
- java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/J
- java 语法
- 编程技巧
- QT5 将QDocWidget的上边框去掉
- oracle聚合函数rank()的用法和一些体会
- 小白谈memcache和memcached的区别
- vs 常用设置和快捷键