[英]Transaction timeout for log process with EJB timer service
我正在使用EJB创建抓取服务器。 使用计时器服务器时,我遇到JTA事务超时问题:
@Schedule(persistent=false, minute="*", hour="*")
public void startBaidu() {
// 1) Get some data about URL from database
// 2) GET THE RESULTS FROM URL BY SELENIUM
// 3) Store the results to database
}
步骤1,3只需花费几毫秒,但步骤2需要1 2分钟! 有什么办法可以拥有JTA的优势,并且还可以对此问题做些什么?
您是否检查了步骤2的时间很长,不仅是因为Selenium的功能如何? 可能值得研究替代解决方案,或者创建自己更有效的替代方案。
另外,您可以在config.xml中增加超时(尽管显然这不是理想的),特别是以下部分:
<JTA
MaxUniqueNameStatistics="5"
TimeoutSeconds="300"
RecoveryThresholdMillis="150000"
MaxResourceUnavailableMillis="900000"
MaxResourceRequestOnServer="60"
MaxXACallMillis="180000"
/>
(来自Oracle文档 )
@Singleton或@Stateful EJB中发生超时问题。 如果是这种情况,并且该事务需要是线程安全的,请考虑:
@Schedule(persistent=false, minute="*", hour="*")
@AccessTimeout(SOME_MORE_MINUTES)
public void startBaidu() {
// 1) Get some data about URL from database
// 2) GET THE RESULTS FROM URL BY SELENIUM
// 3) Store the results to database
}
如果该方法是线程安全的(可以并发访问),则没有线程持有该锁以仅执行读取
@Schedule(persistent=false, minute="*", hour="*")
@Lock(LockType.READ)
public void startBaidu() {
// 1) Get some data about URL from database
// 2) GET THE RESULTS FROM URL BY SELENIUM
// 3) Store the results to database
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.