首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消@Asynchronous EJB调用

取消@Asynchronous EJB调用
EN

Stack Overflow用户
提问于 2011-01-24 11:59:33
回答 2查看 5.9K关注 0票数 7

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

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

我有一个简单的界面:

代码语言:javascript
复制
public interface AsyncInterface
{
    Future<Integer> run() throws Exception;
}

其bean实现如下所示:

代码语言:javascript
复制
@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);
     }
}

客户端代码简单明了:

代码语言:javascript
复制
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的输出是一个无休止的“工作”流;它永远不会检测到取消。

如果相关,我将在JBoss应用服务器6.0.0上运行该应用程序。我没有找到很多使用Future接口的cancel特性的示例代码,所以我想知道我是否正确地使用了Future。这种用法看起来正确吗?有没有更好的方法来取消异步EJB方法调用?

EN

回答 2

Stack Overflow用户

发布于 2011-02-16 06:32:03

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

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

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

然后,消息驱动bean周期性地检查临时队列中的取消消息。

这比@Asynchronous版本更复杂,但它在JBoss AS 6.0.0上工作。

票数 3
EN

Stack Overflow用户

发布于 2011-01-24 12:27:24

您必须return Future类型的对象,而不是null。顺便问一下,你没有拿到NPE吗?在你的代码有问题的情况下,我希望有一个。

此外,不应该调用cancel()See the docs here。顺便说一句,根据docs,不仅仅是cancel()方法不应该被调用,任何实例方法都不应该被调用。这就引出了一个问题,为什么一个方法应该返回AsyncResult。我根本不知道,也许它会有未来的用途。但class level comments建议,所有的方法都是为了方便将结果提供给容器。

因此,我不确定是否可以取消异步EJB调用。

在对进行了一些研究之后编辑了

尝试这个实现,

代码语言:javascript
复制
@Stateless
@Remote(AsyncInterface.class)
public class AsyncBean
{
    @Resource SessionContext myContext;

    @Asynchronous
    public 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 result;
     }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4778504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档