郵箱是Actor模型的一個重要組成部分,負責接收發過來的消息,並保存起來,等待Actor處理。郵箱中維護著兩種隊列,一種是存系統消息,另一個是存用戶消息,系統省是指Started,Stoping,Stoped之類的,用戶當然指我們自定義的Actor。 另外,我們可以通過實現IMailboxStati... ...
郵箱是Actor模型的一個重要組成部分,負責接收發過來的消息,並保存起來,等待Actor處理。郵箱中維護著兩種隊列,一種是存系統消息,另一個是存用戶消息,系統省是指Started,Stoping,Stoped之類的,用戶當然指我們自定義的Actor。
另外,我們可以通過實現IMailboxStatistics介面,來獲取郵箱的狀態變更,並且可以有多個IMailboxStatistics實現。
碼友看代碼:
1 using Proto; 2 using Proto.Mailbox; 3 using System; 4 using System.Threading.Tasks; 5 6 namespace P005_Mailboxes 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 var props = new Props() 13 // 用道具代理返回一個IActor實例 14 .WithProducer(() => new MyActor()) 15 //預設郵箱使用無界隊列 16 .WithMailbox(() => UnboundedMailbox.Create(new MyMailboxStatistics())) 17 // 預設的 spawner 構造 Actor, Context 和 Process 18 .WithSpawner(Props.DefaultSpawner); 19 20 //從props衍生pid,pid代理一個actor的地址 21 var pid = Actor.Spawn(props); 22 //把Hello對象交給HelloActor處理 23 pid.Tell(new MyEntity 24 { 25 Message = "this is message" 26 }); 27 Console.ReadLine(); 28 } 29 } 30 public class MyActor : IActor 31 { 32 public Task ReceiveAsync(IContext context) 33 { 34 if (context.Message is MyEntity myEntity) 35 { 36 Console.WriteLine(myEntity.Message); 37 } 38 return Actor.Done; 39 } 40 } 41 public class MyEntity 42 { 43 public string Message { get; set; } 44 } 45 public class MyMailboxStatistics : IMailboxStatistics 46 { 47 public void MailboxEmpty() 48 { 49 Console.WriteLine("郵箱MailboxEmpty"); 50 } 51 52 public void MailboxStarted() 53 { 54 Console.WriteLine("郵箱MailboxStarted"); 55 } 56 57 public void MessagePosted(object message) 58 { 59 Console.WriteLine("郵箱MessagePosted:"+message); 60 } 61 62 public void MessageReceived(object message) 63 { 64 Console.WriteLine("郵箱MessageReceived:"+message); 65 } 66 } 67 }
當消息Posted時,Started時,Received時,郵箱為空時,這些方法會被先後調用,這裡可對消息作處理。