zookeeper学习3之原生java api调用

【Office激活】学校正版Office已激活成功仍弹出激活窗口 学校正版Office激活问题:已激活成功仍弹出激活窗口 阅读详情

      建立个maven项目,pom.xml中引入zookeeper的jar。对于zookeeper中创建、删除、修改、查询数据都有同步和异步方式,下面写的例子,都是用同步的方式。如果想看异步、同步、权限控制等例子,可参考http://www.cnblogs.com/leesf456/p/6028416.html

<dependencies>
    <dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.9</version>
   </dependency>
  </dependencies>
在resources文件夹下添加文件

log4j.properties,该文件可以在官网下载zookeeper.3.4.9.tar.gz,解压后,在conf文件夹下

# Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO, CONSOLE
zookeeper.console.threshold=INFO
zookeeper.log.dir=.
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=DEBUG
zookeeper.tracelog.dir=.
zookeeper.tracelog.file=zookeeper_trace.log

#
# ZooKeeper Logging Configuration
#

# Format is "<default threshold> (, <appender>)+

# DEFAULT: console appender only
log4j.rootLogger=${zookeeper.root.logger}

# Example with rolling log file
#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE

# Example with rolling log file and tracing
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE

#
# Log INFO level and above messages to the console
#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n

#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}

# Max log file size of 10MB
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n


#
# Add TRACEFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}

log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
### Notice we are including log4j's NDC here (%x)
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n

1.1创建zookeeper连接

package com.fei.zk;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;

public class ZkTest01 {

	private static CountDownLatch latch = new CountDownLatch(1);
	
	public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
		
		ZooKeeper zk = getZk();
		while(true){
			Thread.sleep(5000);
		}
	}
	/**
	 * 创建zk连接
	 * @return
	 * @throws IOException
	 * @throws InterruptedException
	 */
	public static ZooKeeper getZk() throws IOException, InterruptedException{
		//如果是集群,则逗号隔开,比如192.168.0.219:2181,192.168.0.220:2181,192.168.0.221:2181
				String connStr = "192.168.0.219:2181";
				int session_time = 5000;//每5秒发送一次心跳
				ZooKeeper zk = new ZooKeeper(connStr,session_time,new Watcher(){
					public void process(WatchedEvent event) {
						if (event.getState() == KeeperState.SyncConnected) {

				         System.out.println("zk connection OK....");
				         latch.countDown();//释放阻塞
				         
				        } else if (event.getState().equals(KeeperState.Disconnected)) {

				            // 这时收到断开连接的消息,这里其实无能为力,因为这时已经和ZK断开连接了,只能等ZK再次开启了
				            System.out.println("zk Disconnected");

				        } else if (event.getState().equals(KeeperState.Expired)) {


				                // 这时收到这个信息,表示,ZK已经重新连接上了,但是会话丢失了,这时需要重新建立会话。
				        	System.out.println("zk Expired");
		                    //这里可以进行zk重新连接操作
				        	//do Some thing....
				        } else if (event.getState().equals(KeeperState.AuthFailed)) {

				        	System.out.println("zk AuthFailed");
				        }else {

				        	System.out.println("unkonke...." + event.getType());
				        }
					}
					
				});
				System.out.println("zk status=" + zk.getState());
				latch.await(5000,TimeUnit.MILLISECONDS);//阻塞,等待zk连接成功,或者5s超时,否则不能往下执行
				System.out.println("zk connection OK,lock release....");
				
				return zk;
	}
	
	
	
	
}
2017-02-22 15:52:44,393 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.0.219:2181 sessionTimeout=5000 watcher=com.fei.zk.ZkTest01$1@44efc2d1
zk status=CONNECTING
2017-02-22 15:52:44,425 [myid:] - INFO  [main-SendThread(192.168.0.219:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 192.168.0.219/192.168.0.219:2181. Will not attempt to authenticate using SASL (unknown error)
2017-02-22 15:52:44,436 [myid:] - INFO  [main-SendThread(192.168.0.219:2181):ClientCnxn$SendThread@876] - Socket connection established to 192.168.0.219/192.168.0.219:2181, initiating session
2017-02-22 15:52:44,451 [myid:] - INFO  [main-SendThread(192.168.0.219:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 192.168.0.219/192.168.0.219:2181, sessionid = 0x15a63f17b3c0001, negotiated timeout = 5000
zk connection OK....
zk connection OK,lock release....
连接成功了。如果把zk服务器停止掉,让客户端无法连接,会怎样?

2017-02-22 15:55:33,382 [myid:] - INFO  [main-SendThread(192.168.0.219:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 192.168.0.219/192.168.0.219:2181. Will not attempt to authenticate using SASL (unknown error)
2017-02-22 15:55:34,411 [myid:] - WARN  [main-SendThread(192.168.0.219:2181):ClientCnxn$SendThread@1162] - Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused: no further information
	at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
	at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)
	at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)
会不停的输出连接失败的日志,说明当zookeeper连接服务器失败时,它会不停的自动尝试连接。

1.2创建节点

/**
	 * 测试创建节点
	 * @param zk
	 */
	public static void createNode(ZooKeeper zk){
		
		try {
			//创建test节点,值为test,不需权限控制,值持久化
			zk.create("/test", "test".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			System.out.println("/test 创建成功....");
		} catch (Exception e) {
			System.out.println("/test 创建失败....");
			e.printStackTrace();
		} 
		
		//尝试创建已存在的节点
		try {
			//创建test节点,值为test,不需权限控制,值持久化
			zk.create("/test", "test".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			System.out.println("第二次 /test 创建成功....");
		} catch (Exception e) {
			System.out.println("第二次 /test 创建失败....");
			e.printStackTrace();
		} 
		
		//创建创建父节点不存在,就直接建子节点
		try {
			//创建/app/app01节点,值为test,不需权限控制,值持久化
			zk.create("/app/app01", "app01".getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			System.out.println("/app/app01 创建成功....");
		} catch (Exception e) {
			System.out.println("/app/app01 /test 创建失败....");
			e.printStackTrace();
		} 
	}
zk connection OK....
zk connection OK,lock release....
/test 创建成功....
第二次 /test 创建失败....
org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists for /test
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:119)
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
	at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:783)
	at com.fei.zk.ZkTest01.createNode(ZkTest01.java:90)
	at com.fei.zk.ZkTest01.main(ZkTest01.java:23)
/app/app01 /test 创建失败....
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /app/app01
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:111)
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
	at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:783)
	at com.fei.zk.ZkTest01.createNode(ZkTest01.java:100)
	at com.fei.zk.ZkTest01.main(ZkTest01.java:23)
可以看到, 如果节点已经存在了,再次创建就会抛出异常,如果父节点不存在就直接创建子节点,也会抛出异常.
CreateMode有PERSISTENT, PERSISTENT_SEQUENTIAL, EPHEMERAL, EPHEMERAL_SEQUENTIAL,其中 PERSISTENT,PERSISTENT_SEQUENTIAL服务器都会将数据进行持久化;EPHEMERAL, EPHEMERAL_SEQUENTIAL是临时的,在session中有效,也就是如果zk断开了或session过期了,那这些临时节点就不存在了;SEQUENTIAL就是序列,比如如果path写/app-,CreateMode用XXXX_SEQUENTIAL,那最终节点路径就是/app-0000000001(10个数字)

1.3判断节点是否存在

public static void isExist(ZooKeeper zk){
		String path = "/test";
		try {
			Stat stat = zk.exists(path, false);
			if(stat == null){
				System.out.println("节点 path="+path+"不存在");
			}else{
				System.out.println("节点 path="+path+"存在,stat=" + stat);
			}
		} catch (KeeperException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	

1.4删除节点

/**
	 * 删除节点
	 * @param zk
	 */
	public static void delete(ZooKeeper zk){
		//删除已存在的节点
		try {
			Stat stat = zk.exists("/test", false);
			zk.delete("/test", stat.getVersion());
			System.out.println("删除/test成功....");
		} catch (Exception e) {
			System.out.println("删除/test节点失败...");
			e.printStackTrace();
		}
		//删除不存在的节点
		try {
			zk.delete("/test/test", 0);
			System.out.println("删除/test/test成功.....");
		} catch (Exception e) {
			System.out.println("删除/test/test失败.....");
			e.printStackTrace();
		}
	}
zk connection OK....
zk connection OK,lock release....
删除/test成功....
删除/test/test失败.....
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /test/test
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:111)
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
	at org.apache.zookeeper.ZooKeeper.delete(ZooKeeper.java:873)
	at com.fei.zk.ZkTest01.delete(ZkTest01.java:146)
	at com.fei.zk.ZkTest01.main(ZkTest01.java:26)
删除不存在的节点时,会抛出异常。所以删除时最好先判断节点是否存在,同时删除时,节点的版本后也要正确。节点刚创建时,version=0,当对节点进行修改时,version会自增,这是为了避免并发是导致数据不一致.

1.5修改节点数据

public static void update(ZooKeeper zk){
		try {
			//创建临时节点/test-update,值为update
			zk.create("/test-update", "update".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
			//把值修改为update-2
			zk.setData("/test-update", "update-2".getBytes("utf-8"), 0);
			String data = new String(zk.getData("/test-update", false, null),"utf-8");
			System.out.println("/test-update的值为"+data);
		} catch (Exception e) {
			e.printStackTrace();
		}

zk connection OK....
zk connection OK,lock release....
/test-update的值为update-2

1.6 带有权限控制的节点

  如果创建某个节点的客户端zk连接进行了权限认证并且创建节点时使用Ids.CREATOR_ALL_ACL,则其他客户端连接(没认证或认证信息不一致)是无法对这个节点进行读取、修改、删除等操作的。
public static void auth(){
		try {
			String connStr = "192.168.0.219:2181";
			//创建zk1
			ZooKeeper zk1 = new ZooKeeper(connStr,5000,null);
			//zk1进行认证
			zk1.addAuthInfo("digest", "jianfei".getBytes("utf-8"));
			//zk1创建节点/fei,CREATOR_ALL_ACL进行权限控制
			zk1.create("/fei", "fei".getBytes("utf-8"), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
			
			
			//创建zk2
			ZooKeeper zk2 = new ZooKeeper(connStr,5000,null);
			//zk2读取节点
			System.out.println(new String(zk2.getData("/fei", false, null),"utf-8"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /fei
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:113)
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
	at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:1212)
	at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:1241)
	at com.fei.zk.ZkTest01.auth(ZkTest01.java:183)
	at com.fei.zk.ZkTest01.main(ZkTest01.java:28)
看到报NoAuth for /fei的错误.

1.7获取子节点

/**
	 * 获取子节点
	 * @param zk
	 */
	public static void getChildrenNode(ZooKeeper zk){
		try {
			//创建一些临时节点
			//注意不能再临时节点下创建子节点
			zk.create("/app", "app".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			//子节点可以是临时的
			zk.create("/app/app01", "app01".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
			zk.create("/app/app02", "app02".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
			
			List<String> list = zk.getChildren("/app", false);
			System.out.println("/app的子节点有:");
			for(String c : list){
				System.out.println(c);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
zk connection OK....
zk connection OK,lock release....
/app的子节点有:
app02
app01

1.8节点监控

    其实上面getZk()方法里,就有对创建zk时连接的监控了。看ZooKeeper的方法,会发现其实在getData,isExist,getChildrenNode等方法上,都有Watch参数。

注意:节点上的监听,都是一次性的,比如getData上监听/test节点,然后修改/test的值,这时服务器会发送通知给客户端,但是第二次修改/test上的值时,服务器是不会再发通知给客户端的,除非客户端获取到第一次通知时,再次进行注册监听。
public static void watch(ZooKeeper zk){
		try {
			//监听/watch节点是否存在,
			Stat stat = zk.exists("/watch", new Watcher(){
				public void process(WatchedEvent event) {
					if(event.getType() == EventType.NodeCreated){
						System.out.println("exists中监听到..."+event.getPath()+"...创建了");
					}else if(event.getType() == EventType.NodeDeleted){
						System.out.println("exists中监听到..."+event.getPath()+"...删除了");
					}else if(event.getType() == EventType.NodeDataChanged){
						System.out.println("exists中监听到..."+event.getPath()+"...修改了");
					}
				}
			});
			if(stat == null){
				System.out.println("/watch 不存在");
				//创建
				String s = zk.create("/watch", "watch".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
				System.out.println("创建/watch成功..." + s);
				//获取,并监听
				zk.getData("/watch", new Watcher(){
					public void process(WatchedEvent event) {
						if(event.getType() == EventType.NodeCreated){
							System.out.println("getData中监听到..."+event.getPath()+"...创建了");
						}else if(event.getType() == EventType.NodeDeleted){
							System.out.println("getData中监听到..."+event.getPath()+"...删除了");
						}else if(event.getType() == EventType.NodeDataChanged){
							System.out.println("getData中监听到..."+event.getPath()+"...修改了");
						}
					}
					
				}, null);
				//修改2次
				zk.setData("/watch", "watch2".getBytes("utf-8"), 0);
				zk.setData("/watch", "watch3".getBytes("utf-8"), 1);
				//删除
				zk.delete("/watch", 2);
				
			}else{
				System.out.println("/watch 已存在");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

/watch 不存在
exists中监听到.../watch...创建了
创建/watch成功.../watch
getData中监听到.../watch...修改了
看到,就创建和第一次修改的时候,有通知,第二次修改和删除的时候没通知。。。。也许代码这直接写不直观,可以先写exists的监听,然后再服务器上打开./zkCli.sh,然后手动创建节点,修改值等操作,会更加直观对比。
    节点上的监听都是一次性的,如果想一直监听,则需要接收到第一次通知后,再注册一次监听


 1.9原生API的一些方便之处

  通过上面的例子可以看出原生api的一些不方便之处

1)如果父节点不存在,不能直接创建子节点

2)删除时,如果节点不存在,抛出错误

3)节点监控是一次性的,要一直监控,得自己处理

4)连接丢失,需自己处理,比如重连接

  以上是通过上面例子暂时看到的问题





























别再盯着那 100 条数据了,RAP OData 分页机制到底在保护什么 摘要: SAP BTP ABAP Environment 的 OData 服务默认采用分页保护机制,未指定 $top 时仅返回100条数据并附带下一页链接。这种设计旨在防止资源滥用,而非服务故障。客户端应遵循OData协议规范,直接使用服务端返回的 next link 进行分页请求,而非自行构造URL。当指定 $top 参数时,若数值超过5000仍会被强制分页。该机制在SAPUI5控件中被自动处理,但自定义客户端需主动实现分页逻辑。对于自定义实体(Custom Entity),开发者需在Query Prov 阅读详情

相关推荐

从DBC到ARXML:用RTA-CAR7实现车载通信协议栈自动化生成全流程

本文详细介绍了如何利用ETAS RTA-CAR7工具链,特别是ISOLAR-A和RTA-BSW ConfGen,实现从车载通信DBC文件到AUTOSAR ARXML系统描述文件,再到基础软件(BSW)协议栈代码的自动化生成全流程。该流程通过深度配置、信号路由、PDU复用及规则定制,大幅提升开发效率与一致性,是应对现代汽车电子复杂网络开发的关键实践。

brandy的博客 221

异常:KeeperErrorCode = NodeExists

KeeperErrorCode = NodeExists for /dubbo/xxx

qq_43569601的博客 9081

【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)

PacketTracer软件内MCU芯片编程入门 零基础

ChloeMax_的博客 9455

解决supervisor节点启动失败apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists

问题描述: Ambari UI 启动Storm 过一会即Supervisors 挂掉一个 查看对应节点的supervisor日志 /var/log/storm/supervisor.log tail -n 5000 supervisor.log | grep ERROR -A 10 其中一个条错误 2020-04-28 08:56:36.675 o.a.s.d.s.Supervisor ma...

LZX的博客 1万+

rk3399 linux 5.10 usb 2.0设备上电概率性注册失败

先排除硬件上的问题,然后就烧录kernel 4.1的的镜像,多次测试也没有发现这个问题,所以排除了硬件上的问题,然后。查下usb hub和usb 4G的复位脚,写驱动都给它们配上了,但是还是存在这个问题。最后通过对比rk3399.dtsi发现少了个power-domains = ;多次开关机,发现usb hub和4G都通信失败了,这就有点奇怪了,按理说usb驱动是没啥问题的。加上后,重新编译烧录,重新测试没有发现这个问题了!先查看usb log。

qq_32017483的博客 2673

华三模拟器实战:3分钟搞定路由器DHCP地址池配置(附常见错误排查)

本文提供华三模拟器中路由器DHCP地址池的实战配置指南。通过分步详解,帮助用户在3分钟内完成基础设置,并深入讲解多地址池、中继配置等进阶应用。文章重点剖析了DHCP服务无法工作的常见原因,提供从客户端到服务器的系统性排错方法,助力快速定位并解决地址分配失败、获取参数错误等典型问题。

w1x2y3的博客 360

org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists问题处理

org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists

qq_37623073的博客 929

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 578

已解决org.apache.zookeeper.KeeperException.NodeExistsException异常的正确解决方法,亲测有效!!!

已解决org.apache.zookeeper.KeeperException.NodeExistsException异常的正确解决方法,亲测有效!!!

小明的Java问道之路 3388

深信服桌面云实战:从零部署到高效运维的配置全景指南

本文详细介绍了深信服桌面云从零部署到高效运维的全流程配置指南,涵盖硬件规划、平台部署、虚拟桌面发布、终端管理及性能优化等关键环节。特别强调了双万兆网络架构、分布式存储配置和智能调度功能的应用,帮助用户实现高性能、高可用的虚拟桌面环境。

weixin_28568819的博客 401

【华为OD机试真题】459、小扇和小船的数字游戏、数字游戏 | 机试真题+思路参考+代码解析(CD卷)(C++、Java、Py)

### 🎃题目描述 >小扇和小船今天又玩起来了数字游戏,小船给小扇一个正整数 n(1  现在求 m 的最小值

KJ.JK 1719

解决org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for

org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /zhiHu(连接丢失)还有可能是因为没关防火墙,需要查看以下防火墙状态。

weixin_44606952的博客 4124

人形机器人构成及成本估算(附报告)

这些执行器本身由螺杆、减速器、电机、传感器、滚珠轴承和编码器等组件构成。实现线性与旋转运动互转。人形机器人的运动系统可以由电驱动、液压驱动或气动驱动组成,但由于电驱动具有更高的精度和更快的响应速度,正在成为主流设计方案。执行器:NSK、THK、Harmonic Drive、Leaderdrive、Nidec、Moons。由螺杆、减速器、电机、传感器、轴承和编码器组成(如上为Tesla Optimus执行器设计示意)。传感器:Keyence、Robosense、Sensata、ATI、TE、Sony。

具身机器人和通用AI 1776

ZooKeeper学习专栏(五):Java客户端开发(原生API)详解

本文深入讲解了Zookeeper Java原生API的核心使用,主要包括两大核心类:ZooKeeper类和Watcher接口。ZooKeeper类负责连接管理、会话维护和节点CRUD操作,提供丰富的API方法;Watcher接口则采用观察者模式处理连接状态变更和节点事件,具有一次性触发、轻量级通知等特点。文章通过详细代码示例演示了如何创建会话、注册监听器,并解析了各种事件类型和状态枚举。最后强调客户端版本需与服务端匹配,并建议排除冲突的日志依赖。为开发者掌握Zookeeper客户端开发提供了实用指导。

qq_43947876的博客 1354

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java 操作 ZooKeeper 完全指南:原生API与高级客户端实战

客户端类型代表特点适用场景原生客户端官方提供,功能完整但 API 较底层学习原理、轻量级项目高级封装客户端功能丰富,提供连接管理、重试机制、分布式工具生产环境首选第三方客户端zkClient封装较为简单,部分功能有限历史遗留项目场景推荐选择理由学习原理原生API深入理解底层机制生产项目Curator功能完善、维护性好快速开发CuratorAPI 简洁、开发效率高简单需求zkClient轻量级、快速上手Java 操作 ZooKeeper 可以选择。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2332

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Zookeeper学习:Zookeeper的原生java API

Zookeeper的原生java API,此处只涉及针对Zookeeper节点的操作; 一、连接Zookeeper API里边针对连接Zookeeper有四个方法,即Zookeeper的构造方法有四种: 1、ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) 2、ZooKeeper(String con...

txd2016_5_11的博客 366

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

zookeeper原生客户端api的使用

zookeeper原生api的使用 要使用zookeeper原生的api,需引入下面的jar包: <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.2</version> </dependency> 基本操作 创建会话 package c

morris 2万+

zookeeper之原生API和zkClient的API

文章目录1 ZK的原生API1.1 java操作原生API1.1.1 引入依赖1.1.2 创建会话1.1.3 节点的CRUD 1 ZK的原生API 1.1 java操作原生API 1.1.1 引入依赖 使用java操作zookeeper,引入maven坐标 <dependency> <groupId>org.apache.zookeeper</groupId>...

上善若泪 915

Apache ZooKeeper - 使用原生的API操作ZK

文章目录概述 概述 前面几篇系列博文我们熟悉了如何通过命令来操作ZK节点数据,下面我们来看下如何使用API来操作 主要两种方式 原生API Curator 今天我们来看下如何使用原生的API操作ZK

小工匠 2万+

zookeeper(三):Java原生API的使用以及Watch机制

zookeeper(三):Java原生API的使用以及Watch机制    zookeeper提供了Java调用的API,但是实现的并不是特别强大,本文做一个概念性的了解。    一、简单说明    导入相应的jar包后,通过zookeeper的实例就可以完成相应的zookeeper操作了。    zookeeper的构造方法有很多,但是必须的有三个参数:连接zookeeper的地址;sessio...

that_is_cool的博客 2807

zookeeper 原生API总结

1、环境准备 需要在项目中导入zookeeper所需的jar包,这里使用maven管理。 &lt;dependency&gt; &lt;groupId&gt;org.apache.zookeeper&lt;/groupId&gt; &lt;artifactId&gt;zookeeper&lt;/artifactId&gt; &lt;version&gt;3.4.13&lt;/versi...

MY BLOG 780

Zookeeper原生Java API、ZKClient和Apache Curator 区别对比

zookeeper 常用的3种java客户端: zookeeper原生Java API ZkClient Apache curator

猎人在吃肉 2238

Zookeeper学习(三) 客户端和原生API

前言 在这篇博客里我会主要总结下两个部分的操作: 在安装ZooKeeper的机器上利用ZKClient连接Zookeeper的集群,然后利用相应的命令做一些简单的操作。相信很多没有接触过Zookeeper的同学对第一篇简介里的哪些ZNode等等一些概念其实不是那么清楚,但是经过实际操作后会深入了解许多。 简单介绍下做的一个小demo,介绍了一下对Zookeeper原生API的使用。我们...

a814333256的博客 139

Zookeeper JAVA 原生 API 超详细(三)

1、pom文件 <dependencies> <!--zookeeper--> <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper--> <dependency> <groupId>org.apache.zoo...

qq_34125999的博客 3117

使用JAVA API调用ZooKeeper

一、环境准备及创建会话实例 JAR包 使用JAVAAPI调用ZooKeeper时必须要导入对应的jar包 对应的jar包:ZooKeeper-3.x.x.jar(其中的x需要依据版本而定。注意:使用3.4.14版本的ZooKeeper时,如何使用3.4.14的jar包,创建连接时需要把session超时时间设置长一点否则会报错,改用3.4.10版本的...

advent86的专栏 931

【ZooKeeper系列】2.用Java实现ZooKeeper API的调用

zookeeper api API客户端异常:org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /zk_demo 。完整的报错信息如下: 09:33:52.139 [main-SendThread(106.12.111.172:2181)] DEBUG...

一起理解技术趋势,沉淀长期价值 1760
上一篇: zookeeper学习2之zkCli.sh命令行
下一篇: zookeeper学习4之curator开源的zookeeper客户端
夢_殤
博客等级 码龄15年 348粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值