DeferredResult 在返回可能已设置的实例时是否存在竞争条件?
Does DeferredResult have a race condition when returning a potentially already-set instance?
我在我的 Spring MVC 应用程序中使用 DeferredResult 来处理可能长 运行 操作的一些服务器端处理。它可能非常快,也可能需要一两秒。
但在任何一种情况下,传入的 HTTP 请求都会导致将操作推送到队列, 单独的 线程(通过 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
}
但我想知道 如果操作执行得如此之快以至于 setResult()
方法在DeferredResult
在之前它已经返回(POINT A
)到调用方法。
Spring 是否会看到返回的 DeferredResult
已经有一个值并处理它,或者它只是开始 "watching" 以便 setter 被调用 在实例提供后?
我没有使用过 Spring,但我会说如果结算时间对下游行为有任何影响,Class DeferredResult<>
将是一个非常糟糕的延期实施。
似乎可以安全地假设行为是相同的,无论异步进程的时间如何——毫秒、秒或其他,唯一的条件是在这种情况下 onTimeout
处理程序不会发生超时会 运行 (如果设置)。即使 Deferred 是同步结算的,在创建它的同一代码块中,调用函数也应该按预期对结果进行操作。
如果此假设无效,则 Class DeferredResult<>
不符合目的且不应使用。
我在我的 Spring MVC 应用程序中使用 DeferredResult 来处理可能长 运行 操作的一些服务器端处理。它可能非常快,也可能需要一两秒。
但在任何一种情况下,传入的 HTTP 请求都会导致将操作推送到队列, 单独的 线程(通过 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
}
但我想知道 如果操作执行得如此之快以至于 setResult()
方法在DeferredResult
在之前它已经返回(POINT A
)到调用方法。
Spring 是否会看到返回的 DeferredResult
已经有一个值并处理它,或者它只是开始 "watching" 以便 setter 被调用 在实例提供后?
我没有使用过 Spring,但我会说如果结算时间对下游行为有任何影响,Class DeferredResult<>
将是一个非常糟糕的延期实施。
似乎可以安全地假设行为是相同的,无论异步进程的时间如何——毫秒、秒或其他,唯一的条件是在这种情况下 onTimeout
处理程序不会发生超时会 运行 (如果设置)。即使 Deferred 是同步结算的,在创建它的同一代码块中,调用函数也应该按预期对结果进行操作。
如果此假设无效,则 Class DeferredResult<>
不符合目的且不应使用。