我有一个带有@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。