| /** | 
 |  * 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); | 
 |             }); | 
 |         } | 
 |     } | 
 | } | 
 |  |