zookpeer实现对服务器动态上下线的监听
生活随笔
收集整理的這篇文章主要介紹了
zookpeer实现对服务器动态上下线的监听
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
服務器動態上下線程序的工作機制
服務器代碼:
補充:volatile關鍵字:java中一切都是對象,當多個線程操作同一個對象時候,該對象會放在堆內存中,而多個線程相當于在多個棧中,當A線程想要去除對象中的數據并修改,往往不是直接拿對象的值直接改變其內容,而是先把中的對象賦值一份到A線程棧中,然后再對賦值的對象進行修改,最后把賦值對象與堆中的對象進行比較,不同則修改堆中對象,這樣當多個線程訪問對象時會存在,當A線程修改了堆中賦值對象的值,但還沒來得及修改堆中的對象,而B線程此時拿到的仍然是原對象值并沒有發生更改,為了避免這種問題。因此同volatile關鍵字讓線程直接獲取對象并修改內容無需賦值一份再去修改。
輸出:當args[0]等于weijie1時候,輸出如下
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper). log4j:WARN Please initialize the log4j system properly. 45null weijie1is online/servers/server0000000006 weijie1 is starting客戶端代碼:
package com.itcast.zookpeer.zk;import java.io.IOException; import java.util.ArrayList; import java.util.List;import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper;public class DistributedClient {private static final String connectString = "weijie1:2181,weijie2:2181,weijie3:2181";private static final int sessionTimeout = 2000;private static final String parentNode = "/servers";private static volatile List<String> serverList; ZooKeeper zk = null;//創建客戶端連接private void getConnection() throws Exception {zk = new ZooKeeper(connectString, sessionTimeout, new Watcher(){@Overridepublic void process(WatchedEvent event) {System.out.println(event.getType()+"--"+event.getPath());try{getServerList();}catch(Exception e){}}});}//獲取服務器信息列表private void getServerList() throws Exception {//獲取服務器子節點的信息,并且對父節點進行監聽List<String> server = zk.getChildren(parentNode, true);//先創建一個list來存儲服務器信息List<String> servers = new ArrayList<String>();for (String string : server) {byte[] data = zk.getData(parentNode+"/"+string, false, null);servers.add(new String(data));//new String對data進行解析轉成字符串類型}serverList = servers;System.out.println(serverList);}private void BundleBusiness() throws Exception {System.out.println("is starting");Thread.sleep(Long.MAX_VALUE);}public static void main(String[] args) throws Exception {DistributedClient distribute = new DistributedClient();distribute.getConnection();distribute.getServerList();distribute.BundleBusiness();}}輸出:
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
None--null
[weijie1]
is starting
[weijie1]
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
None--null
[weijie1]
is starting
[weijie1]
NodeChildrenChanged--/servers
[weijie1, weijie1]
分析:當啟動兩次服務器此時在servers目錄下又創建了一個臨時帶序號的節點,此時總共有兩個臨時節點,因此輸出主機名兩次,因為在List<String> server = zk.getChildren(parentNode, true);中多父節點”/servers”進行了監聽。
總結
以上是生活随笔為你收集整理的zookpeer实现对服务器动态上下线的监听的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决虚拟机打开不了?提示VMware W
- 下一篇: 判断两颗棵二叉树是否相等