Linux C++ zookeeper创建临时节点类封装

来源:互联网 发布:下载keep健身软件 编辑:程序博客网 时间:2024/05/29 12:51

至于zookeeper环境搭建和c++ client端的编译,此处就不再赘述了。直接上实现代码吧。

主要功能:zookeeper创建临时节点,可用于判断程序是否存在。

实现思想:实现CZkCreateEphemeralNode类,在构造函数中创建临时节点,析构函数中删除或者不删除都是可以的。那么,定义一个全局对象或者NEW一个对象即可。


CZkCreateEphemeralNode.h

/************************************************************************//* zookeeper Create Ephemeral Node                                      *//************************************************************************/#ifndef __CZKCREATETEMPORARYNODE_H__#define __CZKCREATETEMPORARYNODE_H__#include <string>#include "zookeeper.h"#include "zookeeper_log.h"class CZkCreateEphemeralNode{public:CZkCreateEphemeralNode(std::string m_strHost, int m_nTimeOut, std::string strPath, std::string strValue, std::string& strError);~CZkCreateEphemeralNode();private:CZkCreateEphemeralNode();CZkCreateEphemeralNode(const CZkCreateEphemeralNode&);private:static void zktest_watcher_g(zhandle_t* zh, int type, int state, const char* path, void* watcherCtx);static void zktest_dump_stat(const struct Stat* stat);static void zktest_stat_completion(int rc, const struct Stat* stat, const void* data);static void zktest_void_completion(int rc, const void* data);static void zktest_string_completion(int rc, const char* name, const void* data);public:static int zkOpen(zhandle_t** zkHandle, std::string strHost, int nTimeOut);static int zkCreate(zhandle_t* zkHandle, std::string strPath, std::string strValue);static int zkClose(zhandle_t** zkHandle);//static int zkOpen(std::string strHost, int nTimeOut);//static int zkCreate(std::string strPath, std::string strValue);//static int zkClose();private:std::string m_strHost;int m_nTimeOut;std::string m_strPath;std::string m_strValue;zhandle_t* m_zkHandle;};#endif

CZkCreateEphemeralNode.cpp

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <ctime>#include <string>#include <string.h>#include "CZkCreateEphemeralNode.h"#include <iostream>using namespace std;void CZkCreateEphemeralNode::zktest_watcher_g(zhandle_t* zh, int type, int state, const char* path, void* watcherCtx){printf("Something happened.\n");printf("type: %d\n", type);printf("state: %d\n", state);printf("path: %s\n", path);printf("watcherCtx: %s\n", (char*)watcherCtx);}void CZkCreateEphemeralNode::zktest_dump_stat(const struct Stat* stat){char tctimes[40];char tmtimes[40];time_t tctime;time_t tmtime;if (!stat){fprintf(stderr, "null\n");return;}tctime = stat->ctime / 1000;tmtime = stat->mtime / 1000;ctime_r(&tmtime, tmtimes);ctime_r(&tctime, tctimes);fprintf(stderr, "\tctime = %s\tczxid=%llx\n""\tmtime=%s\tmzxid=%llx\n""\tversion=%x\taversion=%x\n""\tephemearalOwner=%llx\n",tctimes, stat->czxid,tmtimes, stat->mzxid,(unsigned int)stat->version, (unsigned int)stat->aversion,stat->ephemeralOwner);}void CZkCreateEphemeralNode::zktest_stat_completion(int rc, const struct Stat* stat, const void* data){fprintf(stderr, "%s: rc=%d Stat:\n", (char*)data, rc);zktest_dump_stat(stat);}void CZkCreateEphemeralNode::zktest_void_completion(int rc, const void* data){fprintf(stderr, "[%s]: rc = %d\n", (char*)(data == 0 ? "null" : data), rc);}void CZkCreateEphemeralNode::zktest_string_completion(int rc, const char* name, const void* data){fprintf(stderr, "[%s]: rc = %d\n", (char*)(data == 0 ? "null" : data), rc);if (!rc){fprintf(stderr, "\tname = %s\n", name);}}int CZkCreateEphemeralNode::zkOpen(zhandle_t** zkHandle, std::string strHost, int nTimeOut){if (strHost.length() < 0 || nTimeOut < 0){fprintf(stderr, "Init failed.Param error.\n");return -1;}zoo_set_debug_level(ZOO_LOG_LEVEL_WARN);*zkHandle = zookeeper_init(strHost.c_str(), zktest_watcher_g, nTimeOut, 0, (void*)"hello zookeeper.", 0);if (*zkHandle == nullptr){fprintf(stderr, "Error when connecting to zookeeper servers...\n");return -1;}return 0;}int CZkCreateEphemeralNode::zkCreate(zhandle_t* zkHandle, std::string strPath, std::string strValue){if ( strPath.length() <= 0 ){fprintf(stderr, "Create failed.Param error.\n");return -1;}cout << "zoo_acreate: path:" << strPath << ", value:" << strValue << endl;int nRet = zoo_acreate(zkHandle, strPath.c_str(), strValue.c_str(), strValue.length(), &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, zktest_string_completion, "acreate");if (nRet){fprintf(stderr, "Error %d for %s\n", nRet, "acreate");exit(EXIT_FAILURE);}nRet = 0;sleep(1);nRet = zoo_aexists(zkHandle, strPath.c_str(), 1, zktest_stat_completion, "aexists");if (nRet){fprintf(stderr, "Error %d for %s", nRet, "aexists");exit(EXIT_FAILURE);}return 0;}int CZkCreateEphemeralNode::zkClose(zhandle_t** zkHandle){if (*zkHandle){zookeeper_close(*zkHandle);*zkHandle = nullptr;}return 0;}CZkCreateEphemeralNode::CZkCreateEphemeralNode(std::string strHost, int nTimeOut, std::string strPath, std::string strValue, std::string& strError): m_strHost(strHost), m_nTimeOut(nTimeOut), m_strPath(strPath), m_strValue(strValue), m_zkHandle(nullptr){strError = "";if (m_strHost.length() <= 0 || m_nTimeOut <= 0 || m_strPath.length() <= 0 || m_strValue.length() <= 0 ){strError = "Param error.";}int nRet = CZkCreateEphemeralNode::zkOpen(&m_zkHandle, m_strHost, nTimeOut);if ( nRet != 0 ){strError = "zkOpen fialed.";}else{nRet = CZkCreateEphemeralNode::zkCreate(m_zkHandle, m_strPath, m_strValue);if (nRet != 0){strError = "zkCreate fialed.";}}}CZkCreateEphemeralNode::~CZkCreateEphemeralNode() {zkClose(&m_zkHandle);}CZkCreateEphemeralNode::CZkCreateEphemeralNode(){}CZkCreateEphemeralNode::CZkCreateEphemeralNode(const CZkCreateEphemeralNode&) {}

main.cpp

#include "CZkCreateEphemeralNode.h"#include <string.h>#include <iostream>using namespace std;int main() {/************************************************************************//* 二种方式:1、new的方式创建CZkCreateEphemeralNode                     *//* 2、定义全局变量CZkCreateEphemeralNode                     *//************************************************************************/std::string strError;CZkCreateEphemeralNode* pZk = new CZkCreateEphemeralNode("127.0.0.1:2181,127.0.0.1:2182", 3000, "/xyz_test/test_client", "test", strError);if ( strError.length() > 0 ){wcout << L"CZkCreateEphemeralNode error." << endl;}//g_Zk变量必须在程序的整个生命周期(建议使用全局变量)CZkCreateEphemeralNode g_Zk("127.0.0.1:2181,127.0.0.1:2182", 3000, "/xyz_test/test_client1", "test", strError);if (strError.length() > 0){wcout << L"CZkCreateEphemeralNode error." << endl;}char ch;cin >> ch;return 0;}

Makefile

OBJECTS = main.o CZkCreateEphemeralNode.oDES = visZkCreateEphemeralNodeCC = g++ -std=c++11INC = -I /usr/local/include/zookeeper/LINK = -L /usr/local/lib/ -lzookeeper_mt -DTHREADEDall : $(DES)$(DES) : $(OBJECTS)$(CC) -o $(DES) $(OBJECTS) $(LINK) $(INC)main.o : main.cpp$(CC) -o main.o -c main.cpp $(INC) -gCZkCreateEphemeralNode.o : CZkCreateEphemeralNode.cpp CZkCreateEphemeralNode.h $(CC) -o CZkCreateEphemeralNode.o -c CZkCreateEphemeralNode.cpp $(INC) -ginstall:clean:rm -rf $(DES) $(OBJECTS)


CZkCreateEphemeralNode
原创粉丝点击