gpt4 book ai didi

java - playframework java 异步方法调用

转载 作者:行者123 更新时间:2023-11-30 02:58:00 26 4
gpt4 key购买 nike

playframework 2.2(java 7)

我有 REST api,可以接收一些 json,使用 json 数据我正在做一些事情,最后我发送电子邮件并返回结果。发送电子邮件有点慢,所以我想在处理 json 之后在其他线程中调用此电子邮件方法,或者我想异步执行并返回结果而不等待电子邮件方法的执行。

如何在 Controller 中实现和调用异步方法?

这是代码示例

 public static Result register() {
JsonNode json = request().body().asJson();
if (json == null)
Logger.info("bad json request");
try {
RegistrationHandler registrationHandler = new RegistrationHandler();
if(!registrationHandler.isEmailUnique(json)){
return ok("false");
}else{
registrationHandler.saveUser(json);
String email = json.findValue("email").asText();
sendRegistrationEmail(email); // I don't want wait this for execution
return ok("success");
}
} catch (Exception e) {
e.printStackTrace();
}
return ok("error");
}

编辑:

不确定它是否好,但有效。

 JsonNode json = request().body().asJson();
if (json == null)
Logger.info("bad json request");
try {
RegistrationHandler registrationHandler = new RegistrationHandler();
if(!registrationHandler.isEmailUnique(json)){
return ok("false");
}else{
registrationHandler.saveUser(json);
String email = json.findValue("email").asText();
F.Promise<java.lang.Boolean> emailPromise = F.Promise.promise(
new F.Function0<java.lang.Boolean>() {
public java.lang.Boolean apply() {
return sendRegistrationEmail(email);
}
}
);

return ok("success");
}
} catch (Exception e) {
e.printStackTrace();
}
return ok("error");

最佳答案

我使用了你的代码和示例 https://www.playframework.com/documentation/2.2.x/JavaAsync#Async-results但我从未真正运行过这段代码(也没有编译过)。

重点是你必须返回一个 Promise。剩下的事情就由游戏来解决。您可以在第一个调用 sendRegistrationEmail(email) 的 Promise 之后返回 ok() ,但如果发送过程中出现问题,您将失去发送“错误”的能力。

public static Promise<Result> myMethod() {
JsonNode json = request().body().asJson();
if (json == null) {
Logger.info("bad json request");
return badRequest();
}

RegistrationHandler registrationHandler = new RegistrationHandler();
if(!registrationHandler.isEmailUnique(json)) {
return ok("false");
}

registrationHandler.saveUser(json);
String email = json.findValue("email").asText();
F.Promise<Boolean> emailPromise = F.Promise.promise(
new F.Function0<Boolean>() {
public Boolean apply() {
// This method takes a while
return sendRegistrationEmail(email);
}
});

return emailPromise.map(new Function<Boolean, Result>() {
public Result apply(Boolean successful) {
if (successful) {
return ok("success");
} else {
return ok("error");
}
}
});
}

关于java - playframework java 异步方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36715462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com