Jakarta ee 取消异步方法调用

Jakarta ee 取消异步方法调用,jakarta-ee,asynchronous,ejb,ejb-3.1,Jakarta Ee,Asynchronous,Ejb,Ejb 3.1,我正在阅读,在理解方法cancel(布尔MayInterruptFrunning)中的mayInterruptFrunning参数的用途时遇到了一些问题。我从文档中推断,该参数用于通知会话用户试图取消调用,因此即使取消失败,SessionContext.wascelected()方法也应返回true(如果mayinterruptfrunning设置为true)。如果正确,那么以下问题的答案是什么: 1) 什么时候会有人调用cancel方法,并将mayburrunning参数设置为false,这意

我正在阅读,在理解方法
cancel(布尔MayInterruptFrunning)
中的
mayInterruptFrunning
参数的用途时遇到了一些问题。我从文档中推断,该参数用于通知会话用户试图取消调用,因此即使取消失败,
SessionContext.wascelected()
方法也应返回true(如果
mayinterruptfrunning
设置为true)。如果正确,那么以下问题的答案是什么:

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

2) 方法
SessionContext.wascelected()
Future.isCancelled()
的结果有什么不同?如果取消失败,则第二次重新运行为false,而如果将
mayInterruptFrunning
设置为true,则即使取消失败,第一次返回true,对吗

更新:

根据答案,我想提出以下问题:

假设调用带有参数的
mayburrenning
false的
Future.cancel()
方法。任务何时取消,何时不取消?这取决于什么因素? 如果在上述情况下取消(成功),那么
SessionContext.wascelected()
是否返回false,而
Futute.isCancelled()是否返回true

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

当您尝试异步调用时,您不确定具体的状态是什么 服务器端方法的一个例子是。该方法可能仍在等待执行, 可能是执行了,或者已经开始了

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

举个例子:

//code that execuete in the asynchronus service
while (myCondition) {
    doSomething();
    if (mySessionCtx.wasCancelCalled())
    break;
}
如果该方法正在执行,并且您使用
mayinterruptfrunning=false
调用
cancel()
,则循环将在myCondition为false之前不会结束。 如果参数为true,则while循环将被中断

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

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

如上所述,服务器端使用了
SessionContext.wascalled()
,而
Future.isCancelled()

在客户端中用于确定任务是否已取消。

您能否进一步解释它是如何工作的:“如果MayInterruptFrunning=false,则在myCondition为true之前循环不会完成”?如果你的意思是“直到myCondition为false”,那么取消将永远不会执行,那么用MayInterruptFrunning=false来称呼它的目的是什么呢?是的,我的意思是“直到myCondition为false”,对不起;是的,如果该方法正在运行,则永远不会执行取消;目的是在异步调用尚未执行时取消该调用。我同意您的观点,绝大多数情况下,cancel()将被true调用,但假设在某些条件下(为您的业务需求而强制),客户机代码可以决定中断方法执行是否合适。对不起,但我不明白这个问题。我在anotehr公式的更新中修改了这个问题。