주기적으로 작동하는 타이머/스케쥴러 기능은 오랫동안 사용된 방식입니다.
일반적으로 타이머 스레드를 직접 생성하거나, 프레임웍이 제공하는 타이머기능을사용할수도 있지만
액터는 능동적인 객체로, 액터에게 타이머기능을 직접 설계반영도 가능하지만
AKKA에 의해 제공되어지는 액터입니다.
액터설계
import java.time.Duration; import akka.actor.AbstractActorWithTimers; public class MyActor extends AbstractActorWithTimers { private static Object TICK_KEY = "TickKey"; private static final class FirstTick { } private static final class Tick { } public MyActor() { getTimers().startSingleTimer(TICK_KEY, new FirstTick(), Duration.ofMillis(500)); } @Override public Receive createReceive() { return receiveBuilder() .match(FirstTick.class, message -> { // do something useful here getTimers().startPeriodicTimer(TICK_KEY, new Tick(), Duration.ofSeconds(1)); }) .match(Tick.class, message -> { // do something useful here }) .build(); } }
액터정지
.matchEquals("interrupt-child", m -> getContext().stop(child) ) .matchEquals("done", m -> getContext().stop(getSelf()) )
액터는 능동적으로 작동되는 객체로 메시지기반으로 스스로 자신을
중지시킬수가 있습니다.
victim.tell("done")
메시지전송 기법으로 원격또는 로컬액터를 종료시킬수가 있습니다.
정지이벤트
@Override public void postStop() { final String message = "stopped"; // don't forget to think about who is the sender (2nd argument) target.tell(message, getSelf()); final Object result = ""; target.forward(result, getContext()); target = null; }
자신이 정지명령을 받고 정지(소멸과유사)가 될시 정지가 되기전 어떠한 이벤트정의를통해
상위 컴포넌트에게 알려준다거나 하는 기능을 추가해줄수가 있습니다.
액터를 종료시키는 3가지방법
PoisonPill
victim.tell(akka.actor.PoisonPill.getInstance(), ActorRef.noSender());
액터는 메시지 처리 진행중일수도 있습니다. 현재 진행중인 메시지처리가 끝나고
종료를 시키는 방법입니다.
Killing an Actor
victim.tell(akka.actor.Kill.getInstance(), ActorRef.noSender());
때로는 진행중인 상태와 상관없이, 긴급하게 강제로 액터를 종료시켜야하는 상황도
생기게 됩니다.
Graceful Stop
try { CompletionStage<Boolean> stopped = gracefulStop(actorRef, java.time.Duration.ofSeconds(5), Manager.SHUTDOWN); stopped.toCompletableFuture().get(6, TimeUnit.SECONDS); // the actor has been stopped } catch (AskTimeoutException e) { // the actor wasn't stopped within 5 seconds }
컴포넌트 의존성을 ( 액터는 기본적으로 탑다운방식으로 생성이됩니다.) 고려하여 부모액터를 종료하려고
한다면 자신의 최하위 자식액터부터 종료를 시도하고 마지막에 종료를 하려고 했던 부모액터가 안전하게
종료가됩니다. 정상적인 종료시도시 권장되는 종료방식입니다.