Page History
Info |
---|
Actor메시지는 일반적으로 보낸순서에의한 순서가 보장이 되지만 MailBox의 경우 동시에 보낸 메시지중 우선으로 처리해야할 메시지에대해 정의가 가능합니다. |
우선순위 정의 코드
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
using Akka.Actor; using Akka.Event; using Akka.Dispatch; //namespace ServiceA.STUDY public class Issue { public bool IsSecurityFlaw; public bool IsBug; public string Message; public Issue(string message, bool isBug) { Message = message; IsBug = isBug; IsSecurityFlaw = !isBug; } } public class IssueTrackerMailbox : UnboundedPriorityMailbox { public IssueTrackerMailbox(Settings setting , Akka.Configuration.Config config) : base(setting, config) { } protected override int PriorityGenerator(object message) { var issue = message as Issue; if (issue != null) { if (issue.IsSecurityFlaw) return 0; if (issue.IsBug) return 1; } return 2; } } |
...
PriorityGenerator 에서 우선순위를 조정합니다.
Actor 설계
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public class MailBoxActor : ReceiveActor { private ILoggingAdapter log = Context.GetLogger(); public MailBoxActor() { //MailBoxTest Receive<Issue>(issue => { log.Info("IssueInfo : Message:{0} IsSecurityFlaw:{1} IsBug:{2} ", issue.Message, issue.IsSecurityFlaw, issue.IsBug); }); //InboxTest Receive<string>(msg => { if (msg == "hello") Sender.Tell("world"); }); } } |
정의코드를 사용하기위한 설정
...
No Format |
---|
#특정한 액터에 MailBox 메시지 처리기를 사용하겠다고 설정을 합니다. my-custom-mailbox { mailbox-type : "ServiceA.STUDY.IssueTrackerMailbox, ServiceA" } actor.deployment { /mymailbox { mailbox = my-custom-mailbox } } |
실행코드
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
var mailboxOpt = Props.Create<MailBoxActor>().WithMailbox("my-custom-mailbox"); var actor = actorSystem.ActorOf(mailboxOpt, "mymailbox"); Issue msg1 = new Issue("test1",true); Issue msg2 = new Issue("test2", false); Issue msg3 = new Issue("test3", true); Issue msg4 = new Issue("test4", true); Issue msg5 = new Issue("test5", false); actor.Tell(msg1); actor.Tell(msg2); actor.Tell(msg3); actor.Tell(msg4); actor.Tell(msg5); |
...
메시지 순서가 변경된다고 해도, 서비스에 이상이생기는 설계는 하지 말아야 할것입니다.
INBOX
...
Tip |
---|
액터들과의 소통에서, ask패턴은 해결책이 될수 있지만, 할수 없는 작업이 두가지가 있습니다. 여러 액터들로부터 요청한 메시지 다중으로 회신기다리기 ( 물론 어떠한 작업 두가지가 완료되었을시 어떠한 메시지를 보내는 액터를 설계할수는 있지만, 한 코드 스콥에서 해결하기가 어렵습니다.) |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
var target = actorSystem.ActorOf<MailBoxActor>("inboxactor");
var inbox = Inbox.Create(actorSystem);
try
{
///// Sample 1 : 특정 메시지를 받는지 여부
inbox.Send(target, "hello");
bool result = inbox.Receive(TimeSpan.FromSeconds(1)).Equals("world");
Console.WriteLine("result:" + result);
//// Sample 2 : 관리대상 target이 종료되는지 여부...
inbox.Watch(target); //해당 액터를 inbox에서 감시
target.Tell(PoisonPill.Instance, ActorRefs.NoSender);
if( inbox.Receive(TimeSpan.FromSeconds(1)) is Terminated)
{
Console.WriteLine("target 종료됨..");
}
}
catch (TimeoutException)
{
Console.WriteLine("TimeOut");
} |
이경우 Inbox 를 사용하여, 외부에서 복수의 Actor의 요청결과를 묶어낼수 있습니다.