如何在 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();
}
}
我需要在开始游戏时进行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();
}
}