#include #include using namespace NBus; using namespace NCalculator; namespace NCalculator { struct TCalculatorClient: public IBusClientHandler { TCalculatorProtocol Proto; TBusMessageQueuePtr MessageQueue; TBusClientSessionPtr ClientSession; TCalculatorClient() { MessageQueue = CreateMessageQueue(); TBusClientSessionConfig config; config.TotalTimeout = 2 * 1000; ClientSession = TBusClientSession::Create(&Proto, this, config, MessageQueue); } ~TCalculatorClient() override { MessageQueue->Stop(); } void OnReply(TAutoPtr request, TAutoPtr response0) override { Y_ABORT_UNLESS(response0->GetHeader()->Type == TResponse::MessageType, "wrong response"); TResponse* response = VerifyDynamicCast(response0.Get()); if (request->GetHeader()->Type == TRequestSum::MessageType) { TRequestSum* requestSum = VerifyDynamicCast(request.Get()); int a = requestSum->Record.GetA(); int b = requestSum->Record.GetB(); Cerr << a << " + " << b << " = " << response->Record.GetResult() << "\n"; } else if (request->GetHeader()->Type == TRequestMul::MessageType) { TRequestMul* requestMul = VerifyDynamicCast(request.Get()); int a = requestMul->Record.GetA(); int b = requestMul->Record.GetB(); Cerr << a << " * " << b << " = " << response->Record.GetResult() << "\n"; } else { Y_ABORT("unknown request"); } } void OnError(TAutoPtr, EMessageStatus status) override { Cerr << "got error " << status << "\n"; } }; } int main(int, char**) { TCalculatorClient client; for (;;) { TNetAddr addr(TNetAddr("127.0.0.1", TCalculatorProtocol().GetPort())); int a = RandomNumber(10); int b = RandomNumber(10); EMessageStatus ok; if (RandomNumber()) { TAutoPtr request(new TRequestSum); request->Record.SetA(a); request->Record.SetB(b); Cerr << "sending " << a << " + " << b << "\n"; ok = client.ClientSession->SendMessageAutoPtr(request, &addr); } else { TAutoPtr request(new TRequestMul); request->Record.SetA(a); request->Record.SetB(b); Cerr << "sending " << a << " * " << b << "\n"; ok = client.ClientSession->SendMessageAutoPtr(request, &addr); } if (ok != MESSAGE_OK) { Cerr << "failed to send message " << ok << "\n"; } Sleep(TDuration::Seconds(1)); } return 0; }