Java 在返回可能已设置的实例时,DeferredResult是否具有竞争条件?
我在SpringMVC应用程序中使用它来处理可能长时间运行的操作的一些服务器端处理。它可能非常快,也可能需要一两秒钟 但在任何一种情况下,传入的HTTP请求都会导致将一个操作推送到队列,由一个单独的线程(通过Java 在返回可能已设置的实例时,DeferredResult是否具有竞争条件?,java,spring,spring-mvc,asynchronous,deferred,Java,Spring,Spring Mvc,Asynchronous,Deferred,我在SpringMVC应用程序中使用它来处理可能长时间运行的操作的一些服务器端处理。它可能非常快,也可能需要一两秒钟 但在任何一种情况下,传入的HTTP请求都会导致将一个操作推送到队列,由一个单独的线程(通过ExecutorService)负责使用该队列。然后调用回调,通知推送程序操作已完成 我将其中一些行为重构为实用程序方法: public static DeferredResult<String> toResponse(GameManager gameManager, f
ExecutorService
)负责使用该队列。然后调用回调,通知推送程序操作已完成
我将其中一些行为重构为实用程序方法:
public static DeferredResult<String> toResponse(GameManager gameManager, final Player player, Action action) {
DeferredResult<String> deferredResult = new DeferredResult<>();
gameManager.execute(action, new Handler<Result>() {
@Override
public void handle(Result result) {
JSONObject obj;
try {
obj = gameManager.getGameJSON(player);
obj.put("success", result.getResult());
obj.put("message", result.getMessage());
deferredResult.setResult(obj.toString()); // POINT B
} catch (JSONException e) {
deferredResult.setErrorResult(e);
}
}
});
return deferredResult; // POINT A
}
公共静态延迟结果响应(GameManager GameManager、最终玩家、动作){
DeferredResult DeferredResult=新的DeferredResult();
执行(操作,新处理程序(){
@凌驾
公共无效句柄(结果){
JSONObject对象;
试一试{
obj=gameManager.getGameJSON(播放器);
obj.put(“success”,result.getResult());
put(“message”,result.getMessage());
deferredResult.setResult(obj.toString());//点B
}捕获(JSONException e){
延迟结果。设置错误结果(e);
}
}
});
返回递延结果;//点A
}
但是我想知道如果操作的执行速度如此之快,以至于延迟结果上的setResult()
方法在返回给调用方法(点A
)之前被调用(点B
),会发生什么
Spring是否会看到返回的DeferredResult
已经有了一个值并处理它,或者它只是开始“监视”对于在提供实例后调用setter的问题?我没有使用Spring,但我会说,如果结算时间对下游行为产生任何影响,类DeferredResult
将是延迟的非常糟糕的实现
似乎可以安全地假设,无论异步进程的计时是毫秒、秒还是其他时间,行为都是相同的,唯一的条件是没有发生超时,在这种情况下,onTimeout
处理程序将运行(如果设置)。即使延迟被同步结算,在创建它的同一代码块中,调用方函数也应该按预期对结果进行操作
如果此假设无效,则类延迟结果
不符合目的,不应使用。GameManager是执行者服务吗?什么是行动?>