playframework java异步方法调用
playframework 2.2(java 7) 我有restapi,在那里接收一些json,用json数据我正在做一些事情,最后我发送电子邮件并返回结果。发送电子邮件有点慢,所以 我希望在处理json后在其他线程中调用此电子邮件方法,或者我希望执行异步并返回结果,而无需等待电子邮件方法的执行 如何在控制器中实现和调用异步方法 下面是一个代码示例playframework java异步方法调用,java,email,asynchronous,playframework,Java,Email,Asynchronous,Playframework,playframework 2.2(java 7) 我有restapi,在那里接收一些json,用json数据我正在做一些事情,最后我发送电子邮件并返回结果。发送电子邮件有点慢,所以 我希望在处理json后在其他线程中调用此电子邮件方法,或者我希望执行异步并返回结果,而无需等待电子邮件方法的执行 如何在控制器中实现和调用异步方法 下面是一个代码示例 public static Result register() { JsonNode json = request().body().as
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");
JsonNode json=request().body().asJson();
if(json==null)
info(“错误的json请求”);
试一试{
RegistrationHandler RegistrationHandler=新的RegistrationHandler();
if(!registrationHandler.isEmailUnique(json)){
返回ok(“假”);
}否则{
registrationHandler.saveUser(json);
字符串email=json.findValue(“email”).asText();
承诺电子邮件承诺(
新F.函数0(){
public java.lang.Boolean apply(){
返回sendRegistrationEmail(电子邮件);
}
}
);
返回ok(“成功”);
}
}捕获(例外e){
e、 printStackTrace();
}
返回ok(“错误”);
如果您创建了一个承诺来处理JSON检索和处理,那么您可以在兑现承诺时附加一个回调
此代码基于中的示例
公共静态承诺索引(){
最终承诺eventualObject=WS.url(“http://example.com/json")
.get()
.map(响应->//使用json执行一些操作);
//添加回调以在处理json后发送邮件
//这将在另一个线程中发生
onReceive(新的F.Callback(){
//发送电子邮件
},执行上下文);
返回eventualObject.map(
新函数(){
公共结果应用(来自JSON obj的某些内容){
返回ok(//无论您对obj做什么);
}
}
);
}
我在中使用了您的代码和示例
但我从来没有实际运行过这段代码(也没有编译过)
关键是你必须回报一个承诺。游戏处理其余的事情。您可以在调用sendRegistrationEmail(email)
的第一个承诺之后返回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");
}
}
});
}
公共静态方法(){
JsonNode json=request().body().asJson();
if(json==null){
info(“错误的json请求”);
返回请求();
}
RegistrationHandler RegistrationHandler=新的RegistrationHandler();
if(!registrationHandler.isEmailUnique(json)){
返回ok(“假”);
}
registrationHandler.saveUser(json);
字符串email=json.findValue(“email”).asText();
承诺电子邮件承诺(
新F.函数0(){
公共布尔应用(){
//这种方法需要一段时间
返回sendRegistrationEmail(电子邮件);
}
});
返回emailPromise.map(新函数(){
公共结果应用(布尔成功){
如果(成功){
返回ok(“成功”);
}否则{
返回ok(“错误”);
}
}
});
}
在“编辑”后的代码中,在实际发送电子邮件之前返回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");
}
}
});
}