项目中今天解决一个问题,记录下!apache
有关问题是 开发人员链接 本地 或者 40、4一、42 zookeeper时,全部后台模块有关新增表时建立16位 序列号 对应表中主键就会出问题,而准生产130、14五、146环境下,不会出现问题。windows
例如项目中不少地方 生成表16位 序列号 对应表中主键这么生成服务器
Long contactId = Long.parseLong(ZkGenerateSeq.getIdSeq(SeqID.CONTACT_ID));
/** * 功能描述:3位ID标识+6位日期yymmdd+7位系列号 (16) * * @author fuhp * @date 2016年5月19日 下午8:12:31 * @return String */ public static String getIdSeq(SeqID seqID) { //注意zookeeper下 建立节点目录 /ZKSeq 是否存在 String path = "/ZkSeq/" + seqID.getIdName(); if (!client.exists(path)) { client.create(path, new byte[0], CreateMode.PERSISTENT); } Stat stat = client.writeDataReturnStat(path, new byte[0], -1); int versionSeq = stat.getVersion(); String strSeq = (new Integer(versionSeq)).toString(); while ( 7 > strSeq.length()) { strSeq = "0" + strSeq; } return seqID.getIdSeq() + getFormatDate() + strSeq; }
debug跟踪程序,发现程序到 client.create(path, new byte[0], CreateMode.PERSISTENT);学习
建立根目录 建立节点目录时 就报错,因而把 相应链接 zookeeper 和生成序列号程序 单独提出来测试测试
public class CreateSession { public static void main(String[] args) { //zk集群的地址 String ZKServers = "10.15.34.42:2181,10.15.34.40:2181,10.15.34.41:2181"; ZkClient zkClient = new ZkClient(ZKServers,300000, 100000,new SerializableSerializer()); String path = "/ZkSeq/CONTACT_ID"; System.out.println("conneted ok!"); if (!zkClient.exists(path)) { zkClient.create(path, new byte[0], CreateMode.PERSISTENT); //输出建立节点的路径 System.out.println("created path:"+path); } Stat stat = zkClient.writeDataReturnStat(path, new byte[0], -1); int versionSeq = stat.getVersion(); String strSeq = (new Integer(versionSeq)).toString(); while ( 7 > strSeq.length()) { strSeq = "0" + strSeq; } System.out.println(strSeq); } }
发现 我把路径中 /ZkSeq中 就不会报错 ,加上/ZkSeq 就有问题 ,报错信息Caused by: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /ZkSeqspa
因而链接服务器查看了下.net
到zookeeper安装bin目录下 输入debug
[root@master bin]# ./zkCli.sh -server 10.15.34.42:2181,10.15.34.40:2181,10.15.34.41:2181
ls / 查看 code
发现 没有 ZkSeqorm
输入
create /ZkSeq hello 建立下 问题 就解决了 。
相应博客 可帮助 学习 以及解决问题