주기적으로 작동하는 타이머/스케쥴러 기능은 오랫동안 사용된 방식입니다.

일반적으로 타이머 스레드를 직접 생성하거나, 프레임웍이 제공하는 타이머기능을사용할수도 있지만

액터는 능동적인 객체로, 액터에게 타이머기능을 직접 설계반영도 가능하지만

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
}

컴포넌트 의존성을 ( 액터는 기본적으로 탑다운방식으로 생성이됩니다.) 고려하여 부모액터를 종료하려고

한다면 자신의 최하위 자식액터부터 종료를 시도하고 마지막에 종료를 하려고 했던 부모액터가 안전하게

종료가됩니다. 정상적인 종료시도시 권장되는 종료방식입니다.  




  • No labels
Write a comment…