在Akka Scheduler中

时间:2016-08-04 09:14:21

标签: java akka scheduled-tasks

我有一个线程,需要在特定的日子运行,让我们说它是每个月的第一天。 因为我们正在使用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只是为了在特定时间启动调度程序,之后根据重启时间重复调度程序。

2 个答案:

答案 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实例。