我使用EJB创建抓取服务器。当我使用像这样的计时器服务器时,我有JTA Transaction Timeout问题:
@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的优势并且也可以解决这个问题吗?
答案 0 :(得分:0)
您是否检查了第2步的长时间不仅仅是因为Selenium的功能如何?可能值得研究替代解决方案,或创建自己更有效的替代方案。
或者,您可以在config.xml中增加超时(尽管这显然不是很理想),特别是此部分:
<JTA
MaxUniqueNameStatistics="5"
TimeoutSeconds="300"
RecoveryThresholdMillis="150000"
MaxResourceUnavailableMillis="900000"
MaxResourceRequestOnServer="60"
MaxXACallMillis="180000"
/>
(来自Oracle docs)
答案 1 :(得分:0)
@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
}