playframework java异步方法调用

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

playframework 2.2(java 7)

我有restapi,在那里接收一些json,用json数据我正在做一些事情,最后我发送电子邮件并返回结果。发送电子邮件有点慢,所以 我希望在处理json后在其他线程中调用此电子邮件方法,或者我希望执行异步并返回结果,而无需等待电子邮件方法的执行

如何在控制器中实现和调用异步方法

下面是一个代码示例

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