2012-04-16 2 views
5

나는 임의의 데이터의 유효성을 검사하고 해당 데이터의 표시 시간을 기반으로 일부 데이터를 변경하고 업데이트하는 Akka 액터가 있습니다. 현재 내가 무엇을하고 있어요 것은 컨트롤러 내부에이 코드를 사용하고 :Play Framework 2.0은 서버 시작시 Akka Actor를 예약합니다.

static ActorRef instance = Akka.system().actorOf(new Props(ValidateAndChangeIt.class)); 
static { 
    Akka.system().scheduler().schedule(
     Duration.Zero(), 
     Duration.create(5, TimeUnit.MINUTES), 
     instance, "VALIDATE" 
    ); 
} 

컨트롤러 내부에서이를 사용에 대한 문제는 누군가가 배우를 시작하기위한 해당 컨트롤러에 의해 처리 된 페이지에 액세스 할 수 있고,이다이 경우 모든 일이 멈추지 않습니다.

서버 시작시이를 수행 할 방법이 있습니까? 액터가 예외를 생성하는 경우 실제로 어떻게 동작하는지 모르겠습니다. 미래 일정을 중단 시키 나 계속합니까? 그렇지 않은 경우에는 충돌이나 오류가 발생할 경우 배우를 다시 스케줄링 할 수있는 방법이 있습니까?

서버 시작시 코드를 실행하기위한

답변

13

Global object를 살펴 :

public class Global extends GlobalSettings { 

    @Override 
    public void onStart(Application app) { 
    ActorRef instance = Akka.system().actorOf(new Props(ValidateAndChangeIt.class)); 
    Akka.system().scheduler().schedule(
     Duration.Zero(), 
     Duration.create(5, TimeUnit.MINUTES), 
     instance, "VALIDATE" 
    ); 
    } 

} 
+0

많은 도움이됩니다. –

1

플레이 프레임 워크가 될 수있는 작업의 스케줄링에 의한 방법을 제공하십시오 onStart() 방법 컨트롤러의 코드를 이동 명시 적으로 호출하지 않고 Global.java에서 수행됩니다.

public class Global extends GlobalSettings { 

    private Cancellable scheduler; 

    @Override 
    public void onStart(Application app) { 
     super.onStart(app); 
     schedule(); 
    } 

    @Override 
    public void onStop(Application app) { 
    //Stop the scheduler 
     if (scheduler != null) { 
      scheduler.cancel(); 
      this.scheduler = null; 
     } 
    } 
    private void schedule() { 
     try { 
      ActorRef helloActor = Akka.system().actorOf(new Props(HelloActor.class)); 
      scheduler = Akka.system().scheduler().schedule(
        Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds 
        Duration.create(30, TimeUnit.MINUTES),  //Frequency 30 minutes 
        helloActor, 
        "tick", 
        Akka.system().dispatcher(), null); 
     }catch (IllegalStateException e){ 
      Logger.error("Error caused by reloading application", e); 
     }catch (Exception e) { 
      Logger.error("", e); 
     } 
    } 
} 

그리고 배우를 만들

, onReceive 방법에에서 HelloActor.java , 당신은 등이 도움이

public class HelloActor extends UntypedActor { 

    @Override 
    public void onReceive(Object message) throws Exception { 
     // Do the processing here. Or better call another class that does the processing. 
     // This method will be called when ever the job runs. 
     if (message.equals("tick")) { 
      //Do something 
      // controllers.Application.sendEmails(); 
     } else { 
      unhandled(message); 
     } 
    } 
} 

희망을 이메일을 보내는 데이터의 처리를 할 수 있습니다.