You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

요번장에서는 Actor의 기능을 확장하여 유용한 몇가지 기능들을 살펴보겠습니다.


현재까지 언급된 두가지의 Actor는 다음과같으며, 목적에의해 분리가됩니다.

  • ReceiveActor : 단순하게  메시지요청/응답하는 심플한 액터일때 사용
  • UntypedActor : 커스텀한 액터를 설계하고자할때


ACTOR의 확장기능을 설명하기위해 이제부터는 UntypedActor를 사용하여 진행하겠습니다.


Become/Unbecome


  사용목적 : 메시지 처리기가 어떠한 메시지에 따라 패턴이 변한다고 가정합시다.

이러한 경우,어떠한 패턴이없다면 상태값을 내부변수로 두고 이값에따라 다중 IF문을 통해

분기처리를 할것입니다. 메시지 처리에대한 중첩 IF문이 발생하기때문에 가독성이 떨어지거나

유지보수가 힘들수 있습니다. 이경우 메시지 처리기 자체를 변경을 지원하는 기능입니다.

FSM(Finite-state machine) 을 지원하기위한 기능입니다.


처리기가 변하는 Actor
	//foo 라고하면 행복해졌다가, bar라고하면 화나는 ACTOR
    public class HotSwapActor : UntypedActor
    {
        private ILoggingAdapter log = Context.GetLogger();  //기본탑재 로그  using Akka.Event

        protected override void OnReceive(object message)
        {
            log.Info("NORMAL:"+message.ToString());
            switch (message as string)
            {
                case "foo":                    
                    log.Info("행복해짐");
                    Become(Happy);
                    break;
                case "bar":
                    log.Info("화남");
                    Become(Angry);
                    break;
            }
        }

        private void Angry(object message)
        {
            log.Info("Angry:" + message.ToString());
            switch (message as string)
            {
                case "foo":
                    log.Info("행복해짐");
                    Become(Happy);
                    break;
                case "bar":                    
                    log.Info("이미 화가났다.");
                    Sender.Tell("이미 화가났다.");
                    break;
            }
        }

        private void Happy(object message)
        {
            log.Info("Happy:" + message.ToString());
            switch (message as string)
            {
                case "foo":
                    log.Info("이미 행복하다.");
                    Sender.Tell("이미 행복하다.");
                    break;
                case "bar":
                    log.Info("화남");
                    Become(Angry);
                    break;
            }
        }
    }

TestCode
        protected void SomeTest3() //BecomeTest
        {
            IActorRef myActor = actorSystem.ActorOf<HotSwapActor>("myactor");            
            myActor.Tell("bar");
            myActor.Tell("foo");
            myActor.Tell("bar");
            myActor.Tell("foo");
            myActor.Tell("bar");
            myActor.Tell("bar");
            myActor.Tell("foo");
        }

[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] NORMAL:bar
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] 화남
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] Angry:foo
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] 행복해짐
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] Happy:bar
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] 화남
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] Angry:foo
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] 행복해짐
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] Happy:bar
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] 화남
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] Angry:bar
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] 이미 화가났다.
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] Angry:foo
[INFO][2017-09-05 오전 6:50:10][Thread 0005][[akka://ServiceA/user/myactor#16204
11193]] 행복해짐
[INFO][2017-09-05 오전 6:50:10][Thread 0006][akka://ServiceA/deadLetters] Messag





  • No labels