本章主要是通过helloWorld来介绍SmartRoute组件的使用,SmartRoute和一般的通讯组件使用方式用点差别,使用方式主要强调就用零配置和零安装即可用.在传统通讯应用中需要开启服务端然后由另一方连接然后进行消息交互;而在SmartRoute中则以消息订阅和投递进行消息交互,所以在使用SmartRoute的时候只需要关注两件事情:以那个资源ID进行消息订阅和需要向那个资源ID发送消息.
接下来通过一个helloWorld的示例来详解SmartRoute的使用.
初始化组件
既然组件强调的是零配置和零安装,组件初始化自然就是一件简单的事情.不过在使用组件前需要引用两个DLL:SmartRoute.DLL和Newtonsoft.Json.DLL.接下来需要做的就是一行代码的事情.
Route.AddLogHandler(new ConsoleLogHandler(LogType.DEBUG | LogType.ERROR | LogType.FATAL | LogType.INFO | LogType.NONE | LogType.WARN));
Route.DefaultNode.Open();
通过Route.DefaultNode.Open()打开默认节点
订阅消息
组件提供SubscribeEvent对象来订阅消息
ken = new SubscribeEvent("ken");
使用对象构建一个订阅的时候必须给一个唯一标识,确保在整个群集中是唯一的.如果同一ID在不同服务中订阅,那集群在投递的时候就会选择最后一次注册.
注册后可以针对订阅对象制一系列的消息路由方法.
henry = new SubscribeEvent("henry");
henry.RegisterProcess<Hello>((o, e) =>
{
Console.WriteLine(e.Message.GetBody<Hello>().Content);
e.Result = e.Message.Reply(new Hello { Content = "I'm fine!" });
});
以上是henry订阅只要接收到的消息是Hello对象,则执行相应的方法.
投递消息
订阅对象提供几种消息投递方式,分别是:投递后不需要获取返回结果,投递后结果异步方法调用和投递后获取返回结果.
Hello hello = new Hello { Content = "hello henry! how are you?" };
IMessage message = ken.Get("henry", hello);
if (message != null)
Console.WriteLine(message.GetBody<Hello>().Content);
以上是向henry发送一个hello的消息.
示例Request完整代码
namespace SmartRoute.HelloRequest
{
class Program
{
static SubscribeEvent ken;
static void Main(string[] args)
{
Route.AddLogHandler(new ConsoleLogHandler(LogType.DEBUG |
LogType.ERROR | LogType.FATAL | LogType.INFO |
LogType.NONE | LogType.WARN));
Route.DefaultNode.Open();
ken = new SubscribeEvent("ken");
while (true)
{
Hello hello = new Hello { Content = "hello henry! how are you?" };
IMessage message = ken.Get("henry", hello);
if (message != null)
Console.WriteLine(message.GetBody<Hello>().Content);
System.Threading.Thread.Sleep(1000);
}
}
}
}
示例Response完整代码
namespace SmartRoute.HelloResponse
{
class Program
{
static SubscribeEvent henry;
static void Main(string[] args)
{
Route.AddLogHandler(new ConsoleLogHandler(LogType.DEBUG |
LogType.ERROR | LogType.FATAL | LogType.INFO |
LogType.NONE | LogType.WARN));
Route.DefaultNode.Open();
henry = new SubscribeEvent("henry");
henry.RegisterProcess<Hello>((o, e) =>
{
Console.WriteLine(e.Message.GetBody<Hello>().Content);
e.Result = e.Message.Reply(new Hello { Content = "I'm fine!" });
});
System.Threading.Thread.Sleep(-1);
}
}
}