1.java-api客户端连接zk
1.1.格式
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
throws IOException
{
this(connectString, sessionTimeout, watcher, false);
}
connectString zk连接地址,如果多个用英文逗号分开
sessionTimeout 客户端连接session超时时间(单位毫秒数)
watcher 监听后的事件处理
1.2.样例
ZooKeeper zk=new ZooKeeper("127.0.0.1:2181,127.0.0.1:2182", 30000, new Watcher(){
/**
*
* @Description: 这里就是事件回调通知的回调方法
* @Author: gaoxinfu
* @Time:2019年1月1日 上午8:31:05
*/
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println(event.getState());
System.out.println(event.getType());
System.out.println(event.getPath());
}
});
2.java-api客户端-创建节点
2.1.格式
public String create(final String path, byte data[], List<ACL> acl,CreateMode createMode)
path:节点路径
data:节点值
acl:节点的权限控制 枚举
createMode:创建的节点类型,可以看枚举
2.2.样例
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
public class ZkClientTest {
public static void main(String[] args) throws IOException, Exception {
/**
* 构造java-zk 客户端实例
*/
ZooKeeper zk=new ZooKeeper("127.0.0.1:2181,127.0.0.1:2182", 30000, new Watcher(){
/**
*
* @Description: 这里就是事件回调通知的回调方法
* @Author: gaoxinfu
* @Time:2019年1月1日 上午8:31:05
*/
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println(event.getState());
System.out.println(event.getType());
System.out.println(event.getPath());
}
});
zk.create("/myGirls", "性感的".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
zk.close();
}
}
2.java-api客户端-获取节点值
/**
* @param path the given path 路径
* @param watch whether need to watch this node 是否监听该节点
* @param stat the stat of the node 节点的状态
* @return the data of the node 节点的数据
*/
public byte[] getData(String path, boolean watch, Stat stat)
zk.getData("/myGirls", true, null);
3.java-api客户端-更新节点值
3.1.格式
public Stat setData(final String path, byte data[], int version)
path:节点路径
data:节点值
version:版本,如果交给zk去维护,则传递-1
3.2.样例
public class ZkClientTest {
public static void main(String[] args) throws IOException, Exception {
/**
* 构造java-zk 客户端实例
*/
ZooKeeper zk=new ZooKeeper("127.0.0.1:2181,127.0.0.1:2182", 30000, new Watcher(){
/**
*
* @Description: 这里就是事件回调通知的回调方法
* @Author: gaoxinfu
* @Time:2019年1月1日 上午8:31:05
*/
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println(event.getState());
System.out.println(event.getType());
System.out.println(event.getPath());
}
});
// zk.create("/myGirls", "性感的".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
// zk.create("/myGirls", "性感的".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//相当于对节点 "/myGirls"设置了数据变化的监听,一旦节点数据变化,监听就会触发,不变化 不会
// zk.getData("/myGirls", true, null);
//这里对节点数据进行了修改,那么设置的监听就会触发
zk.setData("/myGirls", "美丽的".getBytes(), -1);
zk.close();
}
}
输出
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
SyncConnected
None
null
SyncConnected
NodeDataChanged
/myGirls
SyncConnected
NodeDataChanged
/myGirls
这三个输出是由于我们做了setData操作,导致节点值发生了变化,触发了watcher事件
注意
zk.setData("/myGirls", “美丽的”.getBytes(), -1);
zk.setData("/myGirls", “美丽的”.getBytes(), -1);
这样的数据变化,只会监听通知一次;