Playframework 2.0 在应用程序启动时播放框架2,Akka调度程序不会';t反复运行函数-它只运行一次

Playframework 2.0 在应用程序启动时播放框架2,Akka调度程序不会';t反复运行函数-它只运行一次,playframework-2.0,akka,scheduler,Playframework 2.0,Akka,Scheduler,在应用程序启动时,我希望计划每2分钟运行一次任务(例如,可能每1分钟运行一次) 我试过两种方法: 1.在Runnable中使用Akka调度方法 抽象def计划(初始延迟:持续时间,频率:持续时间,可运行:可运行):可取消 (类似于, 除了我希望它被重复之外,所以我使用schedule而不是scheduleOnce) 2.与参与者一起使用Akka调度方法 抽象def计划(初始延迟:持续时间,频率:持续时间,接收者:ActorRef,消息:任意):可取消 (类似于) 以下是Akka调度程序API:

在应用程序启动时,我希望计划每2分钟运行一次任务(例如,可能每1分钟运行一次)

我试过两种方法:
1.在Runnable中使用Akka调度方法 抽象def计划(初始延迟:持续时间,频率:持续时间,可运行:可运行):可取消
(类似于, 除了我希望它被重复之外,所以我使用schedule而不是scheduleOnce)
2.与参与者一起使用Akka调度方法 抽象def计划(初始延迟:持续时间,频率:持续时间,接收者:ActorRef,消息:任意):可取消 (类似于)

以下是Akka调度程序API:

在这两种情况下,我都重写了Global的onStart方法。 My Global位于根包:/path/TestApp/app/Global.java中

在这两种情况下,当我在生产模式下运行应用程序时(在开发模式下,它根本不工作……堆栈上对此有一个问题),它运行函数或只发送一次消息

如何使其以特定频率重复运行

如果你已经这样做了,或者对如何做有任何想法。。。请回答

稍后编辑1:
首先,非常感谢nico_ekito。
这是一个有效的版本:

类MyUntypedActor.java

import akka.actor.UntypedActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class MyUntypedActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    public void onReceive(Object message) throws Exception {
        if (message instanceof String) {
            log.info("Received String message: {}", message);       
        }
        else {
            unhandled(message);     
        }
    }
}
import java.util.concurrent.TimeUnit;

import play.Application;
import play.GlobalSettings;
import play.libs.Akka;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.util.Duration;
public class Global extends GlobalSettings {

      @Override
      public void onStart(Application app) {
        ActorRef instance = Akka.system().actorOf(new Props(MyUntypedActor.class));
        Akka.system().scheduler().schedule(
            Duration.Zero(),
            Duration.create(10, TimeUnit.SECONDS),
            instance, "VALIDATE"
        );
      } 
}
类Global.java

import akka.actor.UntypedActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class MyUntypedActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    public void onReceive(Object message) throws Exception {
        if (message instanceof String) {
            log.info("Received String message: {}", message);       
        }
        else {
            unhandled(message);     
        }
    }
}
import java.util.concurrent.TimeUnit;

import play.Application;
import play.GlobalSettings;
import play.libs.Akka;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.util.Duration;
public class Global extends GlobalSettings {

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

br/> 这个版本适用于阿克卡演员。 但我还需要使用Akka调度程序进行WS-call,类似这样:
$20Scheduler/play framework/-WAr7xk3H-o/oLg9ZrwwFDgJ
但是在Java版本中

所以。。。我如何安排一个函数以特定的频率运行而不使用参与者? 在我的其他情况下,演员可以工作,但对于WS-call来说似乎应该更简单

稍后编辑2:
我发现案例1(使用Akka schedule方法和Runnable)不起作用,因为在同一个onStart方法中,我定义了一个参与者。。。Runnable似乎不“喜欢”演员实例…

案例2,本质上和nico_ekito的案例一样,仍然不起作用。。。因此,我将避免使用 新道具().withCreator(新的非类型DactorFactory()

因为它显然有问题。

你看了这个吗?@nico_ekito我看到过这个问题,但直到现在我才尝试过。即使它看起来像是我使用匿名非类型演员的情况,你给出的例子……很有效!@nico_ekito是的,我开始理解Akka,但我发现很难仅仅制作相同的示例应用程序为了测试调度程序是否适用于所有需要的情况,我读了这个?@Viktor Klang Thx链接…我还没有读过。当我有时间的时候,我会用一个测试应用程序再试一次。你看了这个吗?@nico_ekito我看到了这个问题,但我直到现在都没有试过。即使它看起来像我使用匿名的情况我们的非类型演员,你给出的例子…有效!@nico_ekito是的,我开始掌握Akka,但我发现很难制作相同的示例应用程序来测试调度器是否适用于所有需要的情况阅读此文?@Viktor Klang Thx的链接…我还没有读过。当我有时间时,我会用测试应用程序再试一次。