1. 服务开发
1.1创建服务
运行创建脚本
/usr/local/taf/create_taf_server.sh[App][Server][Servant]
如
/usr/local/taf/create_taf_server.shTestAppHelloServerHello
其中
App:TestApp
Server:HelloServer
Sevant:Hello
命令执行后,会在当前目录的TestApp/HelloServer/目录下,生成下面文件:
HelloServer.hHelloServer.cppHello.jceHelloImp.hHelloImp.cppmakefile
这些文件,已经包含了最基本的服务框架和默认测试接口实现。
JCE接口文件(JCE的语法和使用,参见《TAF开发指南(c++)》),如下:
Hello.jce:
moduleTestApp
{
interfaceHello
{
inttest();
};
};
采用jce2cpp工具自动生成c++文件:/usr/local/taf/bin/jce2cpphello.jce会生成hello.cpp,hello.h文件,里面包含客户端和服务端的代码。
HelloImp是Servant的接口实现类,即实现服务定义的jce文件中的接口,如下:
HelloImp.h
#ifndef_HelloImp_H_
#define_HelloImp_H_
#include"servant/Application.h"
#include"Hello.h"
/**
*HelloImp继承hello.cpphello.h中定义的Hello对象
*/
classHelloImp:publicTestApp::Hello
{
public:
/**
*
*/
virtual~HelloImp(){}
/**
*初始化,Hello的虚拟函数,HelloImp初始化时调用
*/
virtualvoidinitialize();
/**
*析构,Hello的虚拟函数,服务析构HelloImp退出时调用
*/
virtualvoiddestroy();
/**
*实现jce文件中定义的test接口
*/
virtualinttest(taf::JceCurrentPtrcurrent){return0;};
};
/////////////////////////////////////////////////////
#endif
HelloImp.cpp:
#include"HelloImp.h"
#include"servant/Application.h"
usingnamespacestd;
//////////////////////////////////////////////////////
voidHelloImp::initialize()
{
//initializeservanthere:
//...
}
//////////////////////////////////////////////////////
voidHelloImp::destroy()
{
//destroyservanthere:
//...
}
HelloServer是服务的实现类,如下:
HelloServer.h:
#ifndef_HelloServer_H_
#define_HelloServer_H_
#includeiostream
#include"servant/Application.h"
usingnamespacetaf;
/**
*HelloServer继承框架的Application类
**/
classHelloServer:publicApplication
{
public:
/**
*
**/
virtual~HelloServer(){};
/**
*服务的初始化接口
**/
virtualvoidinitialize();
/**
*服务退出时的清理接口
**/
virtualvoiddestroyApp();
};
externHelloServerg_app;
////////////////////////////////////////////
#endif
HelloServer.cpp:
#include"HelloServer.h"
#include"HelloImp.h"
usingnamespacestd;
HelloServerg_app;
/////////////////////////////////////////////////////////////////
voidHelloServer::initialize()
{
//添加Servant接口实现类HelloImp与路由Obj绑定关系
addServantHelloImp(ServerConfig::Application+"."+ServerConfig::ServerName+".HelloObj");
//…
}
/////////////////////////////////////////////////////////////////
voidHelloServer::destroyApp()
{
//...
}
/////////////////////////////////////////////////////////////////
intmain(intargc,char*argv[])
{
try
{
g_app.main(argc,argv);
g_app.waitForShutdown();
}
catch(std::exceptione)
{
cerr"std::exception:"e.what()std::endl;
}
catch(...)
{
cerr"unknownexception."std::endl;
}
return-1;
}
/////////////////////////////////////////////////////////////////
1.2 服务编译
进入代码目录,先不修改任何代码,依次执行:
makecleanall
make
maketar
观察输出,是否有错误.如一切无误,服务会生成一个打包文件HelloServer.tgz。
1.3 扩展服务功能
TAF框架提供了接口定义语言的功能,我们称为Jce,可以在Jce文件中,增加一下接口和方法,扩展服务的功能。
可以修改由create_taf_server.sh生成的jce文件,以下3个接口方法中,test是默认生成的,testHello是新增加的接口。
moduleTestApp
{
interfaceHello
{
inttest();
inttestHello(stringsReq,outstringsRsp);
};
};
使用/usr/local/taf/bin/jce2cpphello.jce,重新生成hello.h,hello.cpp。
修改HelloImp.h/HelloImp.cpp,实现新的接口代码。
其中HelloImp.h中新增testHello方法,重载HelloObj的testHello方法:
virtualinttestHello(conststd::stringsReq,std::stringsRsp,taf::JceCurrentPtrcurrent);
HelloImp.cpp实现testHello方法:
intHelloImp::testHello(conststd::stringsReq,std::stringsRsp,taf::JceCurrentPtrcurrent)
{
TLOGDEBUG("HelloImp::testHellosReq:"sReqendl);
sRsp=sReq;
return0;
}
重新makecleanall;make;maketar,会重新生成HelloServer.tgz发布包。
1.4 客户端同步/异步调用服务
在开发环境上,创建/home/tafjce/[APP]/[Server]目录。
例如:/home/tafjce/TestApp/HelloServer
在刚才编写服务器的代码目录下,执行makerelease
这时会在/home/tafjce/TestApp/HelloServer目录下生成h、jce、o和mk文件。
建立客户端代码目录,如TestHelloClient/。
编写main.cpp,创建实例并调用刚编写的接口函数进行测试。
同步方式:
#includeiostream
#include"servant/Communicator.h"
#include"Hello.h"
usingnamespacestd;
usingnamespaceTestApp;
usingnamespacetaf;
intmain(intargc,char**argv)
{
Communicator北京治疗白癜风哪家医院比较好北京好治疗白癜风医院