在Glassfish的@Singleton bean上忽略了TransactionAttribute.NOT_SUPPORTED

时间:2019-07-17 12:45:04

标签: glassfish ejb

我有一个带有@Singleton注释的bean,该方法的工作量很大,以至于可以运行120秒以上。我正在使用Glassfish服务器5.1,默认情况下,容器管理的事务有120秒的超时时间。

我的课看起来像这样。

@Singleton
public class LongRunningService {
    @Schedule(hour = "*", minute = "*/5")
    public void doTheWork() {
        System.out.printf("%s starts %s%n", this.getClass().getSimpleName(), LocalDateTime.now());
        try {
            Thread.sleep(125 * 1_000);
        } catch (InterruptedException e) {
            System.out.printf("interrupted %s%n", LocalDateTime.now());
        }
        System.out.printf("%s ends %s%n", this.getClass().getSimpleName(), LocalDateTime.now());
    }
}

现在,如果我将此类部署到Glassfish服务器,它将产生以下输出。

Info:   LongRunningService starts 2019-07-17T13:55:00.049
Info:   LongRunningService ends 2019-07-17T13:57:05.052
Warning:   EJB5123:Rolling back timed out transaction [JavaEETransactionImpl: txId=8 nonXAResource=null jtsTx=null localTxStatus=1 syncs=[com.sun.ejb.containers.SimpleEjbResourceHandlerImpl@b7803e0, com.sun.ejb.containers.ContainerSynchronization@5b5235c2]] for [LongRunningService]

这正是我所期望的。现在,我通过用@TransactionAttribute (TransactionAttributeType.NOT_SUPPORTED)注释方法来更改类。医生说

  

...如果客户端使用事务上下文进行调用,则容器在调用企业bean的业务方法之前,将事务上下文与当前线程的关联挂起。 ...

据我了解,使用批注时,该方法未在事务中运行,因此不应触发超时。

但是我错了,因为在注释方法时什么都没有改变。尽管如此,回滚确实发生了。

我误解了NOT_SUPPORTED TransactionAttributeType还是该怎么解决?

免责声明:我知道我可以configure the timeout在玻璃鱼中,但是那是我的最少选择,因为从技术上讲,我不需要任何操作,因此这是摆脱污染的更干净的选择而不是将其扩展到28800000 ms。

0 个答案:

没有答案