2

在应用程序启动时,我想安排一个任务每 2 分钟运行一次(例如,它可能每 1 分钟运行一次)。

我尝试了 2 种方式:
1. 使用 Akka schedule 方法和 Runnable abstract def schedule(initialDelay: Duration, frequency: Duration, runnable: Runnable):可取消
(类似于如何在我的 play2.0 框架中集成 SMS & EMAIL Reminders web application.,除了我希望它被重复,所以我使用 schedule 而不是 scheduleOnce)
2. 使用 Akka schedule 方法和 Actor 抽象 def schedule(initialDelay: Duration, frequency: Duration, receiver: ActorRef, message: Any) : 可取消(类似于Java Play2- Akka for jobs

这是 Akka 调度程序 API: http ://doc.akka.io/api/akka/2.0.3/#akka.actor.Scheduler

在这两种情况下,我都覆盖了 Global 的 onStart 方法。我的全局位于根包中:/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);     
        }
    }
}

类 Global.java

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 演员。但我还需要使用 Akka Scheduler 进行 WS 调用,如下所示:
https ://groups.google.com/forum/?fromgroups=#!searchin/play-framework/Akka $20Scheduler/play-framework/ -WAR7xk3H-o/oLg9ZrwwFDgJ
但在 Java 版本中。

那么......我如何安排一个函数在不使用演员的情况下以一定的频率运行?对于我的其他情况,演员可以工作,但对于 WS 调用,它似乎应该更简单......

后期编辑 2:
我发现案例 1(使用带有 Runnable 的 Akka 调度方法)不起作用,因为在同一个 onStart 方法中我定义了一个演员......似乎 Runnable 不“喜欢”演员实例...

案例 2,本质上类似于 nico_ekito 的案例仍然不起作用...所以我会避免使用 new Props().withCreator(new UntypedActorFactory() 的语法,
因为它显然有问题。

4

0 回答 0