Play Framework 2.0在服务器启动时安排Akka Actor

时间:2012-04-16 16:02:23

标签: playframework-2.0 akka

我有一个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"
    );
}

在控制器中使用它的问题是,有人必须访问由该控制器处理的页面才能启动actor,如果没有发生,则所有内容都会暂停。

有没有办法在服务器启动时执行此操作?我实际上不知道如果actor生成异常它的行为。它会停止未来的时间表还是会继续?如果没有,是否有任何方法可以让玩家重新安排以防万一发生崩溃或错误?

2 个答案:

答案 0 :(得分:13)

要在服务器启动时运行代码,请查看Global object:将代码从控制器移至onStart()方法:

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"
    );
  }  

}

答案 1 :(得分:1)

Play Framework提供了一种方法,可以在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);
        }
    }
}

创建Actor HelloActor.java 在on onReceive方法中,您可以处理数据,发送电子邮件等。

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);
        }
    }
}

希望这有帮助。