| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| using Rebus; |
| using Rebus.Configuration; |
| using Rebus.Messages; |
| using Rebus.RabbitMQ; |
| using System; |
| using System.Collections.Generic; |
| using System.IO; |
| using Thrift.Protocol; |
| using Thrift.Transport; |
| |
| /* |
| * The client emits calls to BasicMathServers |
| * |
| * The client implements the BasicMathClient service. |
| * If the server has processed our request, we get the results back through this service |
| */ |
| |
| namespace RebusSample.Client |
| { |
| |
| // handler to be registered with Rebus |
| class MathResponseCallHandler : IHandleMessages<MathResponseCall> |
| { |
| public void Handle(MathResponseCall message) |
| { |
| // Thrift protocol/transport stack |
| var stm = new MemoryStream(message.rawBytes); |
| var trns = new TStreamTransport(stm, null); |
| var prot = new TBinaryProtocol(trns); |
| |
| // create a processor and let him handle the call |
| var hndl = new MathResponsesHandler(); |
| var proc = new BasicMathClient.Processor(hndl); |
| proc.Process(prot, null); // oneway only |
| } |
| } |
| |
| |
| // serves incoming responses with calculation results |
| internal class MathResponsesHandler : BasicMathClient.Iface |
| { |
| public void FourResults(int added, int multiplied, int subtracted, int divided) |
| { |
| Console.WriteLine("added = {0}", added); |
| Console.WriteLine("multiplied= {0}", multiplied); |
| Console.WriteLine("subtracted = {0}", subtracted); |
| Console.WriteLine("divided = {0}", divided); |
| |
| PingAndDoAnotherCalculation(); |
| } |
| |
| |
| public void ThreeResults(int added, int multiplied, int subtracted) |
| { |
| Console.WriteLine("added = {0}", added); |
| Console.WriteLine("multiplied= {0}", multiplied); |
| Console.WriteLine("subtracted = {0}", subtracted); |
| Console.WriteLine("DIV/0 error during division"); |
| |
| PingAndDoAnotherCalculation(); |
| } |
| |
| |
| public void Pong(long value) |
| { |
| var latency = DateTime.Now.Ticks - value; |
| Console.WriteLine("Ping took {0} ms", new DateTime(latency).Millisecond); |
| } |
| |
| |
| private void PingAndDoAnotherCalculation() |
| { |
| var random = new Random(); |
| var client = new MathRequestClient("localhost"); |
| client.Ping(DateTime.Now.Ticks); |
| client.DoTheMath(random.Next(), random.Next()); |
| } |
| } |
| |
| |
| // provides the client-side interface for calculation requests |
| internal class MathRequestClient : BasicMathServer.Iface |
| { |
| private BuiltinContainerAdapter MQAdapter; |
| |
| |
| public MathRequestClient(string server) |
| { |
| MQAdapter = new BuiltinContainerAdapter(); |
| Configure.With(MQAdapter) |
| .Transport(t => t.UseRabbitMqInOneWayMode("amqp://" + server)) // we need send only |
| .MessageOwnership(o => o.FromRebusConfigurationSection()) |
| .CreateBus().Start(); |
| } |
| |
| |
| public void SerializeThriftCall(Action<BasicMathServer.Iface> action) |
| { |
| // Thrift protocol/transport stack |
| var stm = new MemoryStream(); |
| var trns = new TStreamTransport(null, stm); |
| var prot = new TBinaryProtocol(trns); |
| |
| // serialize the call into a bunch of bytes |
| var client = new BasicMathServer.Client(prot); |
| if( action != null) |
| action(client); |
| else |
| throw new ArgumentException("action must not be null"); |
| |
| // make sure everything is written to the MemoryStream |
| trns.Flush(); |
| |
| // send the message |
| var msg = new MathRequestCall() { rawBytes = stm.ToArray() }; |
| MQAdapter.Bus.Send(msg); |
| } |
| |
| |
| public void Ping(long value) |
| { |
| SerializeThriftCall(client => |
| { |
| client.Ping(value); |
| }); |
| } |
| |
| |
| public void DoTheMath( int arg1, int arg2) |
| { |
| SerializeThriftCall(client => |
| { |
| client.DoTheMath(arg1, arg2); |
| }); |
| } |
| } |
| } |
| |