使用EJB计时器服务的日志进程的事务超时

时间:2014-09-18 09:29:22

标签: java java-ee jpa ejb jta

我使用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的优势并且也可以解决这个问题吗?

2 个答案:

答案 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
}