0

我需要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.5where GlobalSettingsis deprecated 并且我看到 2.5 的多个答案不是很清楚,所以我无法完成它。

4

1 回答 1

1

感谢 Alexander B,我已经能够得到我想要的东西。

渴望单身人士

on starteager singleton.

我所做的是 TVDB 的一个类,重要的部分是在这个类的构造函数中编写你想要在开始时做的事情。然后bind在一个模块上:

bind(TVDB.class).asEagerSingleton();

阿卡演员

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

我已经实现了一个每 12 小时调用一次的 actor ,所以我将调度代码放在了preStartvoid 的同一个 actor 中。我认为 Playframework 的文档Scheduling asynchronous tasks没有更新,也没有按原样工作(至少对我来说)。

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

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();
  }

}
于 2016-10-28T19:34:48.103 回答