Service host顾名思义就是服务的提供者,本示例的TestServiceHost定义了两个service,MathService和HelloWorldService,如下:
大家可以看到,这里的service都是从BaseAutoService继承的,您也可以实现IService或继承BaseService。一个可以被NBear.MQ使用的Service基本上做的事情就是接受一个RequestMessage类型的输入参数,返回一个ResponseMessage类型的返回结果。public class MathService : BaseAutoService { public MathService(IServiceMQ mq) : base("demo.math", mq) { } private int getResult(char op, int x, int y) { int rt = 0; switch (op) { case '+': rt = x + y; break; case '-': rt = x - y; break; case '*': rt = x * y; break; case '/': rt = x / y; break; } return rt; } protected override ResponseMessage Run(RequestMessage msg) { Parameter[] parms = msg.Parameters; int rt = getResult(parms[0].Value.ToString()[0], int.Parse(parms[1].Value.ToString()), int.Parse(parms[2].Value.ToString())); ResponseMessage retMsg = new ResponseMessage(); retMsg.ServiceName = msg.ServiceName; retMsg.Parameters = new Parameter[] { new Parameter("Result", rt) }; retMsg.MessageId = Guid.NewGuid(); retMsg.TransactionId = msg.TransactionId; retMsg.RequestHeader = msg.Header; retMsg.Timestamp = DateTime.Now; retMsg.Expiration = DateTime.Now.AddDays(1); return retMsg; } } public class HelloWorldService : BaseAutoService { public HelloWorldService(IServiceMQ mq) : base("demo.helloworld", mq) { } protected override ResponseMessage Run(RequestMessage msg) { Parameter[] parms = msg.Parameters; ResponseMessage retMsg = new ResponseMessage(); retMsg.ServiceName = msg.ServiceName; retMsg.MessageId = Guid.NewGuid(); retMsg.TransactionId = msg.TransactionId; retMsg.RequestHeader = msg.Header; retMsg.Timestamp = DateTime.Now; retMsg.Expiration = DateTime.Now.AddDays(1); retMsg.Text = "hello world"; retMsg.Bytes = System.Text.UTF8Encoding.UTF8.GetBytes(retMsg.Text); retMsg.Data = new System.Data.DataSet("hello world data"); return retMsg; } }
RequestMessage和ResponseMessage都从Message类型继承,除了包含请求和返回相关的一组参数(.net基本数据类型),每个Message包含Text、Bytes和Data属性,分别允许存放和传递string,byte[]和Dataset类型的数据。可见Message实际是一个比较通用的DTO。
下面,我们要将示例service注册到server,这个过程可以非常方便的通过SimpleServiceContainer来实现:
您可以看到,我们首先要通过RemotingClientHelper类获得我们的server发布出来的mq实例。然后,创建一个SimpleServiceContainer实例,并将我们的示例service添加到container,就这么简单。SimpleSeviceContainer会自动为我们注册和绑定service和mq,您也可以注册多个相同和不同类型的service到container。class Program { static void Main(string[] args) { IServiceMQ mq = new RemotingClientHelper(RemotingChannelType.TCP, "127.0.0.1", 8000, 0, new LogHandler(Console.WriteLine)).GetClientInstance<IServiceMQ>("MMQ"); IServiceContainer container = new SimpleServiceContainer(mq); container.RegisterComponent("math host 1", typeof(MathService)); container.RegisterComponent("math host 2", typeof(MathService)); container.RegisterComponent("helloworld 1", typeof(HelloWorldService)); while (Console.ReadLine() != "q") { } } }