簡體   English   中英

在PlayFramework 2.5.X(Java)中調度異步任務

[英]Scheduling asynchronus tasks in PlayFramework 2.5.X (Java)

我們有一個使用PlayFramework 2.5.4和MongoDB的Play-Project。 我們希望每天更新我們的數據庫。 目前,我們會在每次收到請求時檢查時間,並在一天結束時更新。 這導致了一些問題:

  1. 當前玩家必須等待很長時間才能完成請求
  2. 可能會發生有一天沒有更新(但我們想要每天一次,即使沒有任何變化)
  3. 我們必須修改我們插入的每個請求。

所以我發現了AKKA和舊的stackoverflowquestions的文檔(比如如何在Play 2.0.4中安排每日任務+ onStart()? )。 但解決方案不再適用。

Akka.system().scheduler()

已棄用

system.scheduler()

給出compilingerrors( 來自文檔 ),我不知道導入是否丟失或者還有什么。 我知道你應該從版本2.4開始使用@inject,但是我找不到關於如何將它與時間表一起使用或者如何使用它的適當例子

其實我想做的就是每天都在同一時間調用PlayerDBHandler.newDay()。

感謝幫助

沒有看到編譯錯誤,我猜測system沒有定義。 擴展文檔中的示例,這樣的事情應該有效。

public class SchedulingTask {

    @Inject
    public SchedulingTask(final ActorSystem system,
                          @Named("update-db-actor") ActorRef updateDbActor) {
        system.scheduler().schedule(
            Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay
            Duration.create(1, TimeUnit.DAYS),     //Frequency
            updateDbActor,
            "update",
            system.dispatcher(),
            null);
    }
}

system被注入,你也可以注入一個actor的引用。 或者,您可以從system查找actor ref。

一旦你適應了你想做的事情,就在模塊中聲明SchedulingTask

package com.example;
import com.google.inject.AbstractModule;
import play.libs.akka.AkkaGuiceSupport;

public class MyModule extends AbstractModule implements AkkaGuiceSupport {
    @Override
    protected void configure() {
        bindActor(UpdateDbActor.class, "update-db-actor");
        bind(SchedulingTask.class).asEagerSingleton();
    }
}

最后,更新您的應用程序配置以啟用該模塊。

play.modules.enabled += "com.example.MyModule"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM