| /** |
| * 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 server implements the BasicMathServer service . |
| * All results are sent back to the client via the BasicMathClient service |
| */ |
| |
| |
| namespace RebusSample.Server |
| { |
| // handler to be registered with Rebus |
| class MathRequestCallHandler : IHandleMessages<MathRequestCall> |
| { |
| public void Handle(MathRequestCall 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 MathRequestsHandler(); |
| var proc = new BasicMathServer.Processor(hndl); |
| proc.Process(prot, null); // oneway only |
| } |
| } |
| |
| |
| // serves incoming calculation requests |
| internal class MathRequestsHandler : BasicMathServer.Iface |
| { |
| public void Ping(long value) |
| { |
| var client = new MathResponseClient("localhost"); |
| client.Pong(value); |
| } |
| |
| |
| public void DoTheMath(int arg1, int arg2) |
| { |
| var client = new MathResponseClient("localhost"); |
| if( arg2 != 0) |
| client.FourResults( arg1+arg2, arg1*arg2, arg1-arg2, arg1/arg2); |
| else |
| client.ThreeResults( arg1+arg2, arg1*arg2, arg1-arg2); |
| } |
| } |
| |
| |
| // provides the client-side interface for calculation responses |
| internal class MathResponseClient : BasicMathClient.Iface |
| { |
| private BuiltinContainerAdapter MQAdapter; |
| |
| |
| public MathResponseClient(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<BasicMathClient.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 BasicMathClient.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 MathResponseCall() { rawBytes = stm.ToArray() }; |
| MQAdapter.Bus.Send(msg); |
| } |
| |
| |
| public void Pong(long value) |
| { |
| SerializeThriftCall(client => |
| { |
| client.Pong(value); |
| }); |
| } |
| |
| |
| public void ThreeResults(int added, int multiplied, int suctracted) |
| { |
| SerializeThriftCall(client => |
| { |
| client.ThreeResults(added, multiplied, suctracted); |
| }); |
| } |
| |
| |
| public void FourResults(int added, int multiplied, int suctracted, int divided) |
| { |
| SerializeThriftCall(client => |
| { |
| client.FourResults(added, multiplied, suctracted, divided); |
| }); |
| } |
| } |
| } |
| |