程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

回滚时取消 ejb 计时器

发布于2022-09-11 19:56     阅读(1181)     评论(0)     点赞(9)     收藏(1)


有什么方法可以确保在发生异常时取消定期(每 10 秒)和持久计时器?@Timeout方法的实现是这样的(从遗留代码简化):

@Timeout
@TransactionAttribute(REQUIRES_NEW)
public void onTimeout(Timer timer) {
    try {
        doSomeBusinessLogic();
    } catch (Exception e) {
        // throwing this exception makes sure rollback is triggered
        throw new EJBException(e);
    }
}

在 中出现任何异常时doSomeBusinessLogic(),需要回滚其事务。这工作正常。但是,我也会确保计时器被取消。

直接的解决方案是放入timer.cancel()catch 块。但是,这不起作用,因为取消也将被回滚(JEE6 Turorial):

企业 bean 通常在事务中创建一个计时器。如果此事务回滚,则计时器创建也将回滚。类似地,如果 bean 在回滚的事务中取消计时器,则计时器取消将回滚。在这种情况下,计时器的持续时间会被重置,就好像取消从未发生过一样。

如果发生异常/回滚,我如何确保取消计时器(防止任何进一步的超时)?设置最大重试次数也足够了,但我认为 JBoss 不支持这一点。

应用服务器是 JBoss AS 7.2。


解决方案


我还尝试了 Sergey 提出的解决方案,它似乎有效 - 计时器被取消。在 JBoss EAP 6.2 上测试。这是我用于测试的代码:

@Stateless
public class TimeoutTest implements TimeoutTestLocal {

@Resource
TimerService timerService;

@Resource
SessionContext sessionContext;

@Timeout
@TransactionAttribute(TransactionAttributeType.NEVER)
public void tmout(javax.ejb.Timer timer) {
    try {
        System.out.println("timout invoked");
        //instead of internal call let's invoke doNothing as
        //this timeout callback is client of TimeoutTest EJB
        //in this way doNothing will be run inside transaction
        TimeoutTestLocal local = sessionContext.getBusinessObject(TimeoutTestLocal.class);
        local.doNothing();  
    } catch (Exception e) {
        timer.cancel();
        System.out.println("Timer cancelled");
    }
}

@Override 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void doNothing() {
    throw new EJBException("RE Exception");
}


@Override
public void schedule() {
    timerService.createTimer(5000, 10000, "test");
}
}


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/495142/b4cbe341049bda90c052/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)