如何在 Playframework 2.5 上开始和定期调用函数

How can I call a function on start and periodically on Playframework 2.5

我需要在开始游戏时进行WS申请,以便我可以登录外部服务获取令牌。我需要那个令牌来进行未来的请愿。我知道如何提出 WS 请愿,但我不知道将要在开始时执行的代码放在哪里。此时,它处于控制器的功能中。

如果你想要一些这样的代码:

// login data
  ObjectNode tvdbaccount = Json.newObject();
  tvdbaccount.put("apikey", "*****");
  tvdbaccount.put("username", "*****");
  tvdbaccount.put("userkey", "*****");

  // try to login
  String token = "";
  CompletionStage<JsonNode> request = WS.url("https://api.thetvdb.com/login")
                                        .post(tvdbaccount)
                                        .thenApply(WSResponse::asJson);

  try {
    JsonNode response = request.toCompletableFuture()
                               .get(5, TimeUnit.SECONDS);

    token = response.get("token").asText();
  } catch (Exception ex) {
    System.out.println(ex.getMessage());
  }

该令牌将在 24 小时后过期,因此我想每 12 小时调用一个函数来刷新该令牌。那个功能和上一个差不多,只是一个WS请愿

我正在使用 playframework 2.5,其中 GlobalSettings 已被弃用,我看到 2.5 的多个答案不是很清楚,所以我没能完成。

多亏了 Alexander B,我才能够得到我想要的东西。

渴望单例

我用 eager singleton 解析了 on start 函数调用。

我所做的是 class 用于 TVDB 的东西,重要的部分是在 的构造函数 中写下你想在开始时做的事情class。然后把它 bind 放在一个模块上:

bind(TVDB.class).asEagerSingleton();

阿卡演员

对于 periodically 函数调用,我使用了 Akka actor.

我实现了一个 actor,它每 12 小时 调用自己 ,所以我将调度代码放在同一个 actor 的 preStart void 上。我认为 Scheduling asynchronous tasks 的 Playframework 文档没有更新并且无法正常工作(至少对我而言)。

然后,我把它绑定在模块上:

bindActor(TVDBActor.class, "TVDBActor");

如果有人需要此处的演员代码:

public class TVDBActor extends UntypedActor {

  @Inject
  public void preStart(final ActorSystem system, @Named("TVDBActor") ActorRef tvdbActor) {
    system.scheduler().schedule(
      Duration.create(12, TimeUnit.HOURS),
      Duration.create(12, TimeUnit.HOURS),
      tvdbActor,
      "tick",
      system.dispatcher(),
      null
    );
  }

  @Override
  public void onReceive(Object msg) throws Exception {
    TVDB.refreshToken();
  }

}