orleans发送广播消息

一个client发送消息给orleans, 就只需要掉用Grain的函数就行了. 但是有时候Grain需要发送消息给client, 在orleans里面, 就只能通过Observer来实现.

 1 public interface IChat : IGrainObserver
 2 {
 3   void ReceiveMessage(string message);
 4 }
 5 
 6 public class Chat : IChat
 7 {
 8   public void ReceiveMessage(string message)
 9   {
10     Console.WriteLine(message);
11   }
12 }
13 
14 class HelloGrain : Grain, IHello
15 {
16   private ObserverSubscriptionManager<IChat> _subsManager;
17   public override async Task OnActivateAsync()
18   {
19     _subsManager = new ObserverSubscriptionManager<IChat>();
20     await base.OnActivateAsync();
21   }
22   public async Task Subscribe(IChat observer)
23   {
24     _subsManager.Subscribe(observer);
25   }
26   public async Task UnSubscribe(IChat observer)
27   {
28     _SubsManager.Unsubscribe(observer);
29   }
30 }
31 
32 public Task SendUpdateMessage(string message)
33 {
34   _SubsManager.Notify(s => s.ReceiveMessage(message));
35   return TaskDone.Done;
36 }
37 
38 //下面就是Grain发送消息给Client的代码
39 var friend = GrainClient.GrainFactory.GetGrain<IHello>(0);
40 Chat c = new Chat();
41 
42 var obj = await GrainClient.GrainFactory.CreateObjectReference<IChat>(c);
43 await friend.Subscribe(obj);

有了上面的代码, 我们就可以按照自己的需求造一个广播出来.

  • 发送消息给Client上所有的人
  • 发送消息给Client上某一部分人
  • 发送消息给Client上某一个人
 1 enum DestType
 2 {
 3   DestType_All    = 1,
 4   DestType_Server = 2,
 5   DestType_Player = 3,
 6 }
 7 
 8 //这是我们的观察者
 9 public interface IGatewayObserver : IGrainObserver
10 {
11   void SendMessage(int destType, long dest, int msgid, byte[] buffer);
12 }
13 
14 public interface IAllGatewayGrain : IGrainWithIntegerKey
15 {
16   //注册网关
17   Task RegisterGateway(string key);
18   Task UnRegisterGateway(string key);
19 
20   //发送消息
21   Task SendMessage(int destType, long dest, int msgid, byte[] buffer);
22 
23   //注册观察者
24   Task RegisterObserver(string gateway, IGatewayObserver);
25 }
26 
27 public interface IGatewayGrain : IGrainWithStringKey
28 {
29   Task SendMessage(int destType, long dest, int msgid, byte[] buffer);
30 
31   Task RegisterObserver(string gateway, IGatewayObserver);
32 }

上面是接口的设计, 然后只需要在Client启动的时候, 把自己注册到两个Grain里面去, 然后其他的Grain就可以通过两个Grain来发送针对所有人, 服务器, 和个人的消息了.

posted @ 2017-08-29 18:00 egmkang 阅读(...) 评论(...) 编辑 收藏