client.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <library/cpp/messagebus/test/example/common/proto.h>
  2. #include <util/random/random.h>
  3. using namespace NBus;
  4. using namespace NCalculator;
  5. namespace NCalculator {
  6. struct TCalculatorClient: public IBusClientHandler {
  7. TCalculatorProtocol Proto;
  8. TBusMessageQueuePtr MessageQueue;
  9. TBusClientSessionPtr ClientSession;
  10. TCalculatorClient() {
  11. MessageQueue = CreateMessageQueue();
  12. TBusClientSessionConfig config;
  13. config.TotalTimeout = 2 * 1000;
  14. ClientSession = TBusClientSession::Create(&Proto, this, config, MessageQueue);
  15. }
  16. ~TCalculatorClient() override {
  17. MessageQueue->Stop();
  18. }
  19. void OnReply(TAutoPtr<TBusMessage> request, TAutoPtr<TBusMessage> response0) override {
  20. Y_ABORT_UNLESS(response0->GetHeader()->Type == TResponse::MessageType, "wrong response");
  21. TResponse* response = VerifyDynamicCast<TResponse*>(response0.Get());
  22. if (request->GetHeader()->Type == TRequestSum::MessageType) {
  23. TRequestSum* requestSum = VerifyDynamicCast<TRequestSum*>(request.Get());
  24. int a = requestSum->Record.GetA();
  25. int b = requestSum->Record.GetB();
  26. Cerr << a << " + " << b << " = " << response->Record.GetResult() << "\n";
  27. } else if (request->GetHeader()->Type == TRequestMul::MessageType) {
  28. TRequestMul* requestMul = VerifyDynamicCast<TRequestMul*>(request.Get());
  29. int a = requestMul->Record.GetA();
  30. int b = requestMul->Record.GetB();
  31. Cerr << a << " * " << b << " = " << response->Record.GetResult() << "\n";
  32. } else {
  33. Y_ABORT("unknown request");
  34. }
  35. }
  36. void OnError(TAutoPtr<TBusMessage>, EMessageStatus status) override {
  37. Cerr << "got error " << status << "\n";
  38. }
  39. };
  40. }
  41. int main(int, char**) {
  42. TCalculatorClient client;
  43. for (;;) {
  44. TNetAddr addr(TNetAddr("127.0.0.1", TCalculatorProtocol().GetPort()));
  45. int a = RandomNumber<unsigned>(10);
  46. int b = RandomNumber<unsigned>(10);
  47. EMessageStatus ok;
  48. if (RandomNumber<bool>()) {
  49. TAutoPtr<TRequestSum> request(new TRequestSum);
  50. request->Record.SetA(a);
  51. request->Record.SetB(b);
  52. Cerr << "sending " << a << " + " << b << "\n";
  53. ok = client.ClientSession->SendMessageAutoPtr(request, &addr);
  54. } else {
  55. TAutoPtr<TRequestMul> request(new TRequestMul);
  56. request->Record.SetA(a);
  57. request->Record.SetB(b);
  58. Cerr << "sending " << a << " * " << b << "\n";
  59. ok = client.ClientSession->SendMessageAutoPtr(request, &addr);
  60. }
  61. if (ok != MESSAGE_OK) {
  62. Cerr << "failed to send message " << ok << "\n";
  63. }
  64. Sleep(TDuration::Seconds(1));
  65. }
  66. return 0;
  67. }