取消异步方法调用

时间:2013-12-31 10:06:34

标签: java-ee asynchronous ejb ejb-3.1

我正在阅读Java EE docs,我在方法mayInterruptIfRunning中了解cancel(boolean mayInterruptIfRunning)参数的用途时遇到了一些问题。我从文档中得知,该参数用于通知会话用户试图取消调用,因此SessionContext.wasCancelled()方法应该返回true(如果mayInterruptIfRunning设置为true),即使取消失败。如果它是正确的,那么以下问题的答案是什么:

1)什么时候有人会在mayInterruptIfRunning参数设置为false的情况下调用cancel方法,这意味着什么?

2)方法SessionContext.wasCancelled()Future<v>.isCancelled()的结果有何不同?我是对的,如果取消失败,第二次返回错误,而第一次返回true,即使取消失败,只要已将mayInterruptIfRunning设置为真?

更新

基于答案,我想提出这个问题:

假设有人使用参数Future.cancel()调用mayInterruptIfRunning方法为false。任务何时取消,何时取消?它取决于什么因素? 如果在上述情况下取消(成功),SessionContext.wasCancelled()将返回false,而Futute.isCancelled()是否为真?

1 个答案:

答案 0 :(得分:0)

  

1)什么时候有人用mayInterruptIfRunning调用cancel方法   参数设置为false,这意味着什么?

当你尝试cancel异步调用时,你不确定究竟是什么状态 服务器端方法是。该方法可能仍在等待执行, 也许它已被执行或已经开始。

参数mayInterruptIfRunning对最后一种情况很有用。 但是,只有在服务器端实现了一些特殊逻辑才有意义, 我的意思是,如果你检查SessionContext.wasCanceled()方法的状态。

只是一个例子:

//code that execuete in the asynchronus service
while (myCondition) {
    doSomething();
    if (mySessionCtx.wasCancelCalled())
    break;
}

如果方法正在执行,并且您使用cancel()调用mayInterruptIfRunning = false,则循环将不会终止,直到myCondition为false。 如果参数为true,则while循环将被中断。

请注意,moment cancel()不会中断线程执行。

  

2)来自SessionContext.wasCancelled()方法的结果有什么不同   和Future.isCancelled()?

如上所述,SessionContext.wasCancelled()用于服务器端,而Future<V>.isCancelled()用于服务器端 在客户端用于确定任务是否被取消。