【问题标题】:Transaction timeout for log process with EJB timer service使用 EJB 计时器服务的日志进程的事务超时
【发布时间】:2014-09-18 09:29:22
【问题描述】:

我正在使用 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 有优势,也可以针对这个问题做点什么?

【问题讨论】:

    标签: java jakarta-ee jpa ejb jta


    【解决方案1】:

    您是否检查过第 2 步的长时间不仅仅是因为 Selenium 的功能?可能值得研究替代解决方案,或者创建您自己的更有效的替代方案。

    或者,您可以在 config.xml 中增加超时时间(尽管显然这并不理想),特别是本节:

       <JTA
        MaxUniqueNameStatistics="5"
        TimeoutSeconds="300"
        RecoveryThresholdMillis="150000" 
        MaxResourceUnavailableMillis="900000" 
        MaxResourceRequestOnServer="60" 
        MaxXACallMillis="180000" 
       />
    

    (来自Oracle docs

    【讨论】:

      【解决方案2】:

      @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
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 2011-02-20
        • 2020-10-25
        • 1970-01-01
        相关资源
        最近更新 更多