srpc icon indicating copy to clipboard operation
srpc copied to clipboard

关于一个server有多个service,不能正常访问

Open longyn opened this issue 1 week ago • 9 comments

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个服务,只能访问最前面一个服务的接口,请问下是那里没有使用正确吗?

longyn avatar Jun 26 '24 03:06 longyn