如何在 Play Framework 中创建一个 cron 作业
How to create a cron job in Play Framework
我正在创建一个简单的 cron 作业,该作业 运行 使用 Play Framework 2 在特定时间(例如凌晨 3 点)执行任务。6.x。
但现在我陷入了一个简单的计划任务:
我创建了一个演员:
package actors;
import akka.actor.UntypedActor;
import org.slf4j.LoggerFactory;
public class DoSomethingActor extends UntypedActor {
private static final org.slf4j.Logger log = LoggerFactory.getLogger(DoSomethingActor.class);
@Override
public void onReceive(final Object message) throws Throwable {
log.info("Write your crone task or simply call your method here that perform your task " + message);
}
}
然后我创建了一个调度 class,每次我设置时调用 Actor:
package tasks;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Cancellable;
import scala.concurrent.duration.Duration;
@Singleton
public class DoSomethingScheduler {
@Inject
public DoSomethingScheduler(final ActorSystem system,
@Named("do-something-actor") final ActorRef doSomethingActor) {
final Cancellable scheduler;
final int timeDelayFromAppStart = 0;
final int timeGapInSeconds = 1; //Here you provide the time delay for every run
system.scheduler().schedule(
Duration.create(timeDelayFromAppStart, TimeUnit.MILLISECONDS), //Initial delay when system start
Duration.create(timeGapInSeconds, TimeUnit.SECONDS), //Frequency delay for next run
doSomethingActor,
"message for onreceive method of doSomethingActor",
system.dispatcher(),
null);
}
}
最后,我将这些 class 绑定到模块 class:
package modules;
import actors.DoSomethingActor;
import com.google.inject.AbstractModule;
import play.libs.akka.AkkaGuiceSupport;
import tasks.DoSomethingScheduler;
public class SchedulerModule extends AbstractModule implements AkkaGuiceSupport{
@Override
protected void configure() {
this.bindActor(DoSomethingActor.class, "do-something-actor");
this.bind(DoSomethingScheduler.class).asEagerSingleton();
}
}
在这些事情之后,我 运行 应用程序,但它没有像我预期的那样工作。我预计它会每 1 秒显示一次日志记录,但什么也没发生。
你能帮我解决一下吗?
非常感谢!
解决方案是在开发模式下,我必须向应用程序发送 HTTP 请求以加载模块。在生产模式下,它们将立即加载。
我正在创建一个简单的 cron 作业,该作业 运行 使用 Play Framework 2 在特定时间(例如凌晨 3 点)执行任务。6.x。 但现在我陷入了一个简单的计划任务:
我创建了一个演员:
package actors;
import akka.actor.UntypedActor;
import org.slf4j.LoggerFactory;
public class DoSomethingActor extends UntypedActor {
private static final org.slf4j.Logger log = LoggerFactory.getLogger(DoSomethingActor.class);
@Override
public void onReceive(final Object message) throws Throwable {
log.info("Write your crone task or simply call your method here that perform your task " + message);
}
}
然后我创建了一个调度 class,每次我设置时调用 Actor:
package tasks;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Cancellable;
import scala.concurrent.duration.Duration;
@Singleton
public class DoSomethingScheduler {
@Inject
public DoSomethingScheduler(final ActorSystem system,
@Named("do-something-actor") final ActorRef doSomethingActor) {
final Cancellable scheduler;
final int timeDelayFromAppStart = 0;
final int timeGapInSeconds = 1; //Here you provide the time delay for every run
system.scheduler().schedule(
Duration.create(timeDelayFromAppStart, TimeUnit.MILLISECONDS), //Initial delay when system start
Duration.create(timeGapInSeconds, TimeUnit.SECONDS), //Frequency delay for next run
doSomethingActor,
"message for onreceive method of doSomethingActor",
system.dispatcher(),
null);
}
}
最后,我将这些 class 绑定到模块 class:
package modules;
import actors.DoSomethingActor;
import com.google.inject.AbstractModule;
import play.libs.akka.AkkaGuiceSupport;
import tasks.DoSomethingScheduler;
public class SchedulerModule extends AbstractModule implements AkkaGuiceSupport{
@Override
protected void configure() {
this.bindActor(DoSomethingActor.class, "do-something-actor");
this.bind(DoSomethingScheduler.class).asEagerSingleton();
}
}
在这些事情之后,我 运行 应用程序,但它没有像我预期的那样工作。我预计它会每 1 秒显示一次日志记录,但什么也没发生。
你能帮我解决一下吗? 非常感谢!
解决方案是在开发模式下,我必须向应用程序发送 HTTP 请求以加载模块。在生产模式下,它们将立即加载。