gpt4 book ai didi

java - 取消@Asynchronous EJB 调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:54 27 4
gpt4 key购买 nike

我正在编写一个企业 Java 应用程序,它使用异步 EJB 3.1 方法并行执行多个任务。为了支持取消长时间运行的任务,我一直在尝试使用 Future 接口(interface)。

不幸的是,尽管取消调用正在返回 ,但从客户端应用程序调用 future.cancel(true) 似乎对执行任务的 bean 的 session 上下文没有影响是的

我有一个简单的界面:

public interface AsyncInterface
{
Future<Integer> run() throws Exception;
}

使用 bean 实现如下:

@Stateless
@Remote(AsyncInterface.class)
public class AsyncBean
{
@Resource SessionContext myContext;

@Asynchronous
public Future<Integer> run() throws Exception
{
Integer result = 0;

System.out.println("Running AsyncBean");

while(myContext.wasCancelCalled() == false)
{
Thread.sleep(2000);
System.out.println("Working");
}

System.out.println("AsyncBean cancelled");

return new AsyncResult<Integer>(result);
}
}

客户端代码很简单:

InitialContext ctx = new InitialContext();
AsyncInterface async = (AsyncInterface)ctx.lookup("AsyncBean/remote");
Future<Integer> future = async.run();

if( future.cancel(true) )
{
System.out.println("future.cancel() returned true");
}
else
{
System.out.println("future.cancel() returned false");
}

bean的输出是源源不断的“Working”;它永远不会检测到取消。

如果相关,我在 JBoss Application Server 6.0.0 上运行应用程序。我没有找到太多使用 Future 接口(interface)的取消功能的示例代码,所以我想知道我是否正确使用了 Future。这种用法看起来正确吗?是否有更好的选项来取消异步 EJB 方法调用?

最佳答案

回答我自己的问题 - 我发现 JBoss AS 6.0.0 不支持异步请求的取消调用。

作为替代方案,我重构了代码以使用 JMS 请求/响应样式消息传递。

消息驱动 bean 用于执行异步操作。消息驱动 bean 创建一个临时队列并通过 JMS 将队列返回给调用者。这是通过利用 JMS 消息的 replyTo 字段实现的。

然后,消息驱动 bean 会定期检查临时队列中是否有取消消息​​。

这比@Asynchronous 版本更复杂,但它适用于 JBoss AS 6.0.0。

关于java - 取消@Asynchronous EJB 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4778504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com