繁体   English   中英

使用EJB计时器服务进行日志处理的事务超时

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM