玩Framework 2.0的时间表的阿卡演员在服务器启动(Play Framework 2.0 s

2019-06-23 16:38发布

我有一个阿卡演员,用于验证的随机数据,并基于该数据的显示时间和更新它的一些更改。 使用控制器内部的代码目前我在做什么是:

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

使用这种控制器内部的问题是,有人访问由控制器演员开始处理的网页,如果不这样做,一切都保持暂停。

有没有一种方法在服务器启动的做到这一点? 其实我不知道它的行为,如果演员生成异常。 它停止未来的安排或是否继续? 如果没有,有没有做的情况下,演员再安排任何崩溃或错误的方法吗?

Answer 1:

对于在服务器启动时运行的代码,看看在全球对象 :从你的控制器代码移到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"
    );
  }  

}


Answer 2:

玩框架提供了一个途径,使作业的调度可以在完成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);
        }
    }
}

并创建演员, HelloActor.java在上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);
        }
    }
}

希望这可以帮助。



文章来源: Play Framework 2.0 schedules an Akka Actor at server launch