至于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.o
DES = visZkCreateEphemeralNode
CC = g++ -std=c++11
INC = -I /usr/local/include/zookeeper/
LINK = -L /usr/local/lib/ -lzookeeper_mt -DTHREADED
all : $(DES)
$(DES) : $(OBJECTS)
$(CC) -o $(DES) $(OBJECTS) $(LINK) $(INC)
main.o : main.cpp
$(CC) -o main.o -c main.cpp $(INC) -g
CZkCreateEphemeralNode.o : CZkCreateEphemeralNode.cpp CZkCreateEphemeralNode.h
$(CC) -o CZkCreateEphemeralNode.o -c CZkCreateEphemeralNode.cpp $(INC) -g
install:
clean:
rm -rf $(DES) $(OBJECTS)
CZkCreateEphemeralNode