文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【ZooKeeper Notes 3】Z

2023-01-31 04:31

关注

查看PDF版本

转载请注明:@ni掌柜 nileader@gmail.com

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合。通过这些原语言的组合使用,能够帮助我们解决更高层次的分布式问题,关于ZooKeeper的典型使用场景,请查看这个文章《ZooKeeper典型使用场景一览》

本文主要针对ZooKeeper提供的Java API,通过实际代码讲述如何使用API。

  1. package com.taobao.taokeeper.research.sample; 
  2.  
  3. import java.io.IOException; 
  4. import java.util.concurrent.CountDownLatch; 
  5.  
  6. import org.apache.zookeeper.CreateMode; 
  7. import org.apache.zookeeper.KeeperException; 
  8. import org.apache.zookeeper.WatchedEvent; 
  9. import org.apache.zookeeper.Watcher; 
  10. import org.apache.zookeeper.Watcher.Event.KeeperState; 
  11. import org.apache.zookeeper.ZooDefs.Ids; 
  12. import org.apache.zookeeper.ZooKeeper; 
  13.  
  14. import common.toolkit.java.util.ObjectUtil; 
  15.  
  16.  
  17. public class JavaApiSample implements Watcher { 
  18.  
  19.     private static final int SESSION_TIMEOUT = 10000; 
  20.     private static final String CONNECTION_STRING = "test.zookeeper.connection_string:2181"; 
  21.     private static final String ZK_PATH = "/nileader"; 
  22.     private ZooKeeper zk = null; 
  23.      
  24.     private CountDownLatch connectedSemaphore = new CountDownLatch( 1 ); 
  25.  
  26.      
  27.     public void createConnection( String connectString, int sessionTimeout ) { 
  28.         this.releaseConnection(); 
  29.         try { 
  30.             zk = new ZooKeeper( connectString, sessionTimeout, this ); 
  31.             connectedSemaphore.await(); 
  32.         } catch ( InterruptedException e ) { 
  33.             System.out.println( "连接创建失败,发生 InterruptedException" ); 
  34.             e.printStackTrace(); 
  35.         } catch ( IOException e ) { 
  36.             System.out.println( "连接创建失败,发生 IOException" ); 
  37.             e.printStackTrace(); 
  38.         } 
  39.     } 
  40.  
  41.      
  42.     public void releaseConnection() { 
  43.         if ( !ObjectUtil.isBlank( this.zk ) ) { 
  44.             try { 
  45.                 this.zk.close(); 
  46.             } catch ( InterruptedException e ) { 
  47.                 // ignore 
  48.                 e.printStackTrace(); 
  49.             } 
  50.         } 
  51.     } 
  52.  
  53.      
  54.     public boolean createPath( String path, String data ) { 
  55.         try { 
  56.             System.out.println( "节点创建成功, Path: " 
  57.                     + this.zk.create( path, // 
  58.                                               data.getBytes(), // 
  59.                                               Ids.OPEN_ACL_UNSAFE, // 
  60.                                               CreateMode.EPHEMERAL ) 
  61.                     + ", content: " + data ); 
  62.         } catch ( KeeperException e ) { 
  63.             System.out.println( "节点创建失败,发生KeeperException" ); 
  64.             e.printStackTrace(); 
  65.         } catch ( InterruptedException e ) { 
  66.             System.out.println( "节点创建失败,发生 InterruptedException" ); 
  67.             e.printStackTrace(); 
  68.         } 
  69.         return true; 
  70.     } 
  71.  
  72.      
  73.     public String readData( String path ) { 
  74.         try { 
  75.             System.out.println( "获取数据成功,path:" + path ); 
  76.             return new String( this.zk.getData( path, false, null ) ); 
  77.         } catch ( KeeperException e ) { 
  78.             System.out.println( "读取数据失败,发生KeeperException,path: " + path  ); 
  79.             e.printStackTrace(); 
  80.             return ""; 
  81.         } catch ( InterruptedException e ) { 
  82.             System.out.println( "读取数据失败,发生 InterruptedException,path: " + path  ); 
  83.             e.printStackTrace(); 
  84.             return ""; 
  85.         } 
  86.     } 
  87.  
  88.      
  89.     public boolean writeData( String path, String data ) { 
  90.         try { 
  91.             System.out.println( "更新数据成功,path:" + path + ", stat: " + 
  92.                                                         this.zk.setData( path, data.getBytes(), -1 ) ); 
  93.         } catch ( KeeperException e ) { 
  94.             System.out.println( "更新数据失败,发生KeeperException,path: " + path  ); 
  95.             e.printStackTrace(); 
  96.         } catch ( InterruptedException e ) { 
  97.             System.out.println( "更新数据失败,发生 InterruptedException,path: " + path  ); 
  98.             e.printStackTrace(); 
  99.         } 
  100.         return false; 
  101.     } 
  102.  
  103.      
  104.     public void deleteNode( String path ) { 
  105.         try { 
  106.             this.zk.delete( path, -1 ); 
  107.             System.out.println( "删除节点成功,path:" + path ); 
  108.         } catch ( KeeperException e ) { 
  109.             System.out.println( "删除节点失败,发生KeeperException,path: " + path  ); 
  110.             e.printStackTrace(); 
  111.         } catch ( InterruptedException e ) { 
  112.             System.out.println( "删除节点失败,发生 InterruptedException,path: " + path  ); 
  113.             e.printStackTrace(); 
  114.         } 
  115.     } 
  116.  
  117.     public static void main( String[] args ) { 
  118.  
  119.         JavaApiSample sample = new JavaApiSample(); 
  120.         sample.createConnection( CONNECTION_STRING, SESSION_TIMEOUT ); 
  121.         if ( sample.createPath( ZK_PATH, "我是节点初始内容" ) ) { 
  122.             System.out.println(); 
  123.             System.out.println( "数据内容: " + sample.readData( ZK_PATH ) + "\n" ); 
  124.             sample.writeData( ZK_PATH, "更新后的数据" ); 
  125.             System.out.println( "数据内容: " + sample.readData( ZK_PATH ) + "\n" ); 
  126.             sample.deleteNode( ZK_PATH ); 
  127.         } 
  128.  
  129.         sample.releaseConnection(); 
  130.     } 
  131.  
  132.      
  133.     @Override 
  134.     public void process( WatchedEvent event ) { 
  135.         System.out.println( "收到事件通知:" + event.getState() +"\n"  ); 
  136.         if ( KeeperState.SyncConnected == event.getState() ) { 
  137.             connectedSemaphore.countDown(); 
  138.         } 
  139.  
  140.     } 
  141.  

输出结果:

  1. 收到事件通知:SyncConnected 
  2.  
  3. 节点创建成功, Path: /nileader, content: 我是节点初始内容 
  4.  
  5. 获取数据成功,path:/nileader 
  6. 数据内容: 我是节点初始内容 
  7.  
  8. 更新数据成功,path:/nileader, stat: 42950186407,42950186408,1350820182392,1350820182406,1,0,0,232029990722229433,18,0,42950186407 
  9.  
  10. 获取数据成功,path:/nileader 
  11. 数据内容: 更新后的数据 
  12.  
  13. 删除节点成功,path:/nileader 

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯