在应用程序启动时,我想安排一个任务每2分钟运行一次(例如,可能每1分钟一次) .
我试过两种方式:
1.使用带有Runnable抽象def调度的Akka调度方法(initialDelay:Duration,frequency:Duration,runnable:Runnable):可取消
(类似于how to integrate SMS & EMAIL Reminders in my play2.0 framework web application.,除了我希望它重复,所以我使用schedule而不是scheduleOnce)
2.使用Akka schedule方法和Actor abstract def schedule(initialDelay:Duration,frequency:Duration,receiver:ActorRef,message:Any):Cancellable(类似于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);
}
}
}
类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"
);
}
}
这个版本适用于akka演员 . 但我也需要使用Akka Scheduler进行WS调用,如下所示:
https://groups.google.com/forum/?fromgroups=#!searchin/play-framework/Akka $ 20Scheduler / play-framework / -WAr7xk3H-o / oLg9ZrwwFDgJ
但是在Java版本中 .
那么......如何在不使用演员的情况下安排以特定频率运行的功能?对于我的其他情况,演员工作,但对于WS调用似乎应该更简单...
后期编辑2:
我工作是因为在同一个onStart方法中我定义了一个actor ...看来Runnable没有"like" actor实例...
案例2,实际上就像nico_ekito的案例仍然无法工作......所以我会避免使用新的Props() . withCreator(new UntypedActorFactory()
因为它显然有问题 .