[java] Akka 액터의 동적 생성과 종료

Akka는 분산 시스템에서 경량 및 병렬 처리를 제공하는 액터 모델을 기반으로한 라이브러리입니다. 액터는 독립적으로 작동하는 개체로, 상태를 가지고 메시지를 주고받으며 동시에 처리할 수 있습니다. 이번 글에서는 Akka 액터의 동적 생성과 종료에 대해 살펴보겠습니다.

액터의 동적 생성

Akka에서 액터를 동적으로 생성하는 주요 방법은 액터 시스템으로부터 액터 참조를 요청하는 것입니다. 액터 참조를 얻은 후에는 해당 액터를 통해 메시지를 보낼 수 있습니다. 액터를 생성하는 가장 일반적인 방법은 ActorSystem 객체의 actorOf 메서드를 사용하는 것입니다. 아래의 예시 코드를 살펴보겠습니다.

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;

public class DynamicActorCreationExample {

    public static void main(String[] args) {
        ActorSystem actorSystem = ActorSystem.create("MyActorSystem");
        ActorRef myActor = actorSystem.actorOf(Props.create(MyActor.class), "myActor");
        
        // 액터에 메시지 전송
        myActor.tell("Hello, Akka!", ActorRef.noSender());
    }

    // 액터 클래스 정의
    public static class MyActor extends AbstractActor {
        @Override
        public Receive createReceive() {
            return receiveBuilder()
                .match(String.class, message -> {
                    System.out.println("Received message: " + message);
                })
                .build();
        }
    }
}

위의 코드에서는 ActorSystem 객체를 생성한 후 actorOf 메서드를 호출하여 액터를 생성합니다. Props.create 메서드는 액터 클래스를 인스턴스화하는 데 사용되며, Props는 액터 생성에 대한 구성을 제공합니다. 생성된 액터는 ActorRef 객체를 통해 참조할 수 있습니다.

액터의 종료

Akka에서 액터를 종료하기 위해서는 액터에게 특별한 종료 메시지를 전송해야 합니다. 종료 메시지를 받은 액터는 중단되고 모든 메시지 처리가 중단됩니다. 액터를 종료하는 가장 일반적인 방법은 PoisonPill 메시지를 전송하는 것입니다. 아래의 예시 코드를 살펴보겠습니다.

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.PoisonPill;
import akka.actor.Props;

public class ActorTerminationExample {

    public static void main(String[] args) {
        ActorSystem actorSystem = ActorSystem.create("MyActorSystem");
        ActorRef myActor = actorSystem.actorOf(Props.create(MyActor.class), "myActor");

        // 액터에게 종료 메시지 전송
        myActor.tell(PoisonPill.getInstance(), ActorRef.noSender());
    }

    // 액터 클래스 정의
    public static class MyActor extends AbstractActor {
        @Override
        public Receive createReceive() {
            return receiveBuilder()
                .matchAny(message -> {
                    System.out.println("Received message: " + message);
                    // 액터가 종료되면서 메시지 처리 중단
                    getContext().stop(getSelf());
                })
                .build();
        }
    }
}

위의 코드에서는 PoisonPill.getInstance()를 사용하여 액터에게 종료 메시지를 전송합니다. 종료 메시지를 받은 액터는 메시지 처리를 중단하고 소멸됩니다.

결론

이번 글에서는 Akka 액터의 동적 생성과 종료에 대해 알아보았습니다. 액터의 동적 생성은 ActorSystem 객체를 통해 액터 참조를 얻는 것을 의미하며, 액터의 종료는 특정한 종료 메시지를 액터에 전송하여 액터를 중단시키는 것을 의미합니다. Akka를 사용하여 동적인 액터 시스템을 구축할 때, 이러한 기능들을 적절히 활용할 수 있습니다.

참고 자료