play framework 2在应用程序启动时,Akka Scheduler不会重复运行函数 - 它只运行一次

时间:2012-09-15 09:23:49

标签: playframework-2.0 akka scheduler

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

我试过两种方式:
1.使用带有Runnable的Akka调度方法 abstract def schedule(initialDelay:Duration,frequency:Duration,runnable:Runnable):可取消
(类似于how to integrate SMS & EMAIL Reminders in my play2.0 framework web application., 除了我希望它重复,所以我使用schedule而不是scheduleOnce)
2.使用Akka调度方法与Actor abstract 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方法。 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);     
        }
    }
}

Class 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 /播放框架/ -WAr7xk3H-O / oLg9ZrwwFDgJ
但是在Java版本中。

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

后期编辑2:
我发现案例1(使用带有Runnable的Akka调度方法)没有用,因为在同一个onStart方法中我定义了一个actor ......似乎Runnable并不“喜欢”actor实例......登记/>
案例2,实质上就像nico_ekito的案例仍然不起作用...所以我会避免使用语法       new Props()。withCreator(new UntypedActorFactory()
因为它显然有问题。

0 个答案:

没有答案