項目中今天解決一個問題,記錄下!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 建立下 問題 就解決了 。
相應博客 可幫助 學習 以及解決問題