我有一个线程,需要在特定的日子运行,让我们说它是每个月的第一天。 因为我们正在使用Akka Scheduler,所以我只想知道我们是否可以通过Akka来实现。(Quartz调度程序可以轻松解决这个问题。)
我可以在Akka调度程序调度函数中看到,我们还需要在参数中传递重启时间。但是这个特定日期的重启时间并不相同,因为有些月份是30天,31天等。 因此,我的调度程序在每次重启后都运行了。
Cron Expression: cron_expression=0 0 06 1 * ?
restart_time =86400 (here it is 24 hours)
Akka.system().scheduler().schedule(validCronExpressionTime, Duration.create(restart, TimeUnit.SECONDS), thread, Akka.system().dispatcher());
这里validCronExpressionTime将根据文件中的cron_expression设置找到有效日期。
在akka调度程序中,第一个arugument只是为了在特定时间启动调度程序,之后根据重启时间重复调度程序。
答案 0 :(得分:0)
创建一个演员,比如说测试演员并从你的主类和演员里面告诉它,接收使用下面的代码。
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, <choose date of your choice>);
cal.set(Calendar.MONTH, <choose month of your choice>);
Calendar cal2 = Calendar.getInstance();
long duration =(cal2.getTimeInMillis()-cal.getTimeInMillis())/1000;
ActorRef testActorRef = getContext().actorOf(Props.create(Test.class));
getContext().system().scheduler().scheduleOnce(Duration.create(duration, TimeUnit.SECONDS), testActorRef, messege, getContext().system().dispatcher(), null);
答案 1 :(得分:0)
我正在使用akka调度程序,如下面的代码所示。
每个用户都可以登录我的应用程序并可以为后台任务创建调度程序。为此,我正在使用Akka调度程序。
public Cancellable buildScheduler(String actorName, SchedulerActorMessage message, long interval, TimeUnit timeUnit, long initialDelay, String actorMapKey) {
ActorRef daemonRef = actorSystem.actorOf(Props.create(SchedulerActor.class), actorName);
Cancellable cancellableActor = actorSystem.scheduler().schedule(FiniteDuration.apply(initialDelay, timeUnit),
FiniteDuration.apply(interval, timeUnit), daemonRef, message,
actorSystem.dispatcher(), ActorRef.noSender());
actorMap.put(actorMapKey, cancellableActor);
return cancellableActor;
}
现在,我在SchedulerActor中定义了以下工作,
public class SchedulerActor extends AbstractActor {
@Override
public Receive createReceive() {
return receiveBuilder().match(SchedulerActorMessage.class, message -> {
CompletableFuture<String> jobResult =
message.getJob().scheduleJob(message.Id());
jobResult.thenAccept(state -> {
if (state.equals(DONE)) {
//do post action
} else {
//handle exception
}
});
}).build();
}
我正在SchedulerActorMessage中传递我的Job实例。