srpc
srpc copied to clipboard
关于一个server有多个service,不能正常访问
1. DeviceStatus
service TDeviceStatus
{
bool isRunning();
}
2. TPingService
service TPingService
{
/** ping */
void ping();
}
3. Server
#include <string>
#include <memory>
#include <cstdio>
#include <signal.h>
#include <workflow/WFFacilities.h>
#include "TPingService.srpc.h"
#include "TDeviceStatus.srpc.h"
static WFFacilities::WaitGroup wait_group(1);
static void sig_handler(int signo) {
wait_group.done();
}
class PingServiceImpl : public TPingService::Service {
private:
static int mCallCount;
public:
virtual void ping() {
printf("ping %d\n", ++mCallCount);
}
};
int PingServiceImpl::mCallCount = 0;
class DeviceStatusImpl : public TDeviceStatus::Service {
public:
virtual bool isRunning() {
printf("is running = true\n");
return true;
}
};
class PingAccess {
private:
int mPort;
public:
PingAccess()
: mPort(9090) {
}
bool start() {
signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler);
srpc::ThriftServer server;
PingServiceImpl pingservice_impl;
server.add_service(&pingservice_impl);
DeviceStatusImpl devicestatus_impl;
server.add_service(&devicestatus_impl);
if (server.start(mPort) == 0) {
printf("server start 0.0.0.0:%s ...\n", mPort);
wait_group.wait();
server.stop();
} else {
printf("error server start\n");
}
return true;
}
};
int main(int argc, char const *argv[]) {
PingAccess ping;
ping.start();
return 0;
}
Client
#include <string>
#include <memory>
#include <cstdio>
#include "TPingService.srpc.h"
#include "TDeviceStatus.srpc.h"
class PingAccess {
private:
std::shared_ptr<TPingService::ThriftClient> mspTclient;
std::shared_ptr<TDeviceStatus::ThriftClient> mspDeviceClient;
std::string mIp;
int mPort;
public:
PingAccess()
: mIp("127.0.0.1")
, mPort(9090) {
}
bool start() {
mspTclient = std::make_shared<TPingService::ThriftClient>(mIp.c_str(), mPort);
mspDeviceClient = std::make_shared<TDeviceStatus::ThriftClient>(mIp.c_str(), mPort);
{
mspTclient->ping();
if (mspTclient->thrift_last_sync_success()) {
printf("TService::ping => OK\n");
} else {
auto const &sync_ctx = mspTclient->thrift_last_sync_ctx();
printf("TService::ping => error: %s\n", sync_ctx.errmsg);
}
mspDeviceClient->isRunning();
if (mspDeviceClient->thrift_last_sync_success()) {
printf("Status::isRunning=> OK\n");
} else {
auto const &sync_ctx = mspDeviceClient->thrift_last_sync_ctx();
printf("Status::isRunning=> error: %s\n", sync_ctx.errmsg);
}
}
return true;
}
};
int main(int argc, char const *argv[]) {
PingAccess ping;
ping.start();
return 0;
}
5. Client输出结果
TService::ping => OK
Status::isRunning=> error: TApplicationException: Wrong method name
我查看文档 docs-03-server.md中,有如下描述:
- 每一个Server可以拥有任意的Service,但在当前Server里ServiceName必须唯一
, 已确认当ServiceName唯一,分别为"TPingService"和"TDeviceStatus"
如果只分别启动一个服务,都可以正常访问,同时启动2个服务,只能访问最前面一个服务的接口,请问下是那里没有使用正确吗?