【问题标题】:Transaction timeout on step level vs server.xml步骤级别与 server.xml 的事务超时
【发布时间】:2019-01-22 16:17:13
【问题描述】:

在 JSR-352 批处理上,我将块处理的步骤级别的事务超时定义为 900 秒。同时,我在 server.xml 中提到的事务超时为 1800 秒。此块处理步骤使用 PartitionMapper 步骤进行分区。 我的问题是当步骤被执行时,很少有线程使用 900 秒的步骤级事务超时超时。 但是基于 server.xml 事务超时(1800 秒),很少有线程会挂起一段时间并超时。

<step id="ReportBatch" >
    <properties >
        <property name="javax.transaction.global.timeout" value="900"/>
    </properties></step>

server.xml
<transaction clientInactivityTimeout="1800" propogatedOrBMTTranLifetimeTimeout="1800" totalTranLifetimeTimeout="1800" transactionLogDirectory="${server.config.dir}/tranlog/"/>

我希望线程应该失败,并在步骤级别中提到 900 秒超时。 哪个事务超时优先? 是否可以从 server.xml 中删除事务超时,或者减少 server.xml 的超时限制

【问题讨论】:

  • 我试图在this post 中涵盖该主题。请看看它是否回答了您的问题。
  • 基于上述帖子和来自 ibm 链接,仅当应用程序组件未设置自己的事务超时时才使用此超时。但在我的情况下,我可以看到不同的行为,正如提到的少数线程使用应用程序指定的超时,这是步骤级别。少数线程使用服务器指定的超时。这就是我的困惑
  • 我也有 maxIdletime。 这会有什么影响吗?
  • 好的,你说得对,“javax.transaction.global.timeout”步骤属性超时提供了应用程序超时,它应该约束块事务,即使对于分区线程也是如此。我希望你的分区线程在 900 秒后超时,除非你自己做一些事情,比如挂起和从分区线程启动一些其他事务。如果您可以发布一个在 1800 秒后超时的线程的堆栈跟踪,我会看看。
  • 此外,当阅读器无法读取结果集(由于查询的性能)时,我遇到了错误。它因以下错误而失败。 CWWKY0024W: 当前块已回滚到作业实例 227,001 和作业执行 227,002 中步骤 genReport 的前一个检查点。步骤指标 = [(READ_SKIP_COUNT,0), (PROCESS_SKIP_COUNT,0), (WRITE_SKIP_COUNT,0), (FILTER_COUNT,0), (COMMIT_COUNT,0), (READ_COUNT,0), (WRITE_COUNT,0), (ROLLBACK_COUNT,0 )] 如何处理这个错误,是否需要在语句对象上设置查询超时。

标签: java batch-processing websphere-liberty jsr352


【解决方案1】:

配置事务超时

是的,步骤属性 javax.transaction.global.timeout" 设置分区级线程在分区块步骤中执行“块”的事务超时,就像您在作业 XML 中所做的那样(JSL)sn-p:

<step id="ReportBatch" >
    <properties >
        <property name="javax.transaction.global.timeout" value="900"/>
    </properties>
    <chunk>...</chunk>
    <partition>...</partition>
</step>

服务器配置可以通过以下方式为这些“应用程序”事务超时设置上限:

<transaction propogatedOrBMTTranLifetimeTimeout="1800s"/>

因此,对于上面的示例,您的块事务的有效传输超时将为 900 秒。

这很详细,还有this问答中的一些其他选项。

事务超时会发生什么

当事务超时时,事务会立即被标记为回滚,并且 messages.log 中会显示一条消息以及相关线程的详细信息,包括堆栈跟踪。

但是,您的应用程序可能不会立即注意到。如果它“挂起”通过网络进行调用或进行 CPU 密集型计算,它将继续,并且可能仅在触及事务资源或检查事务状态等时看到抛出异常。

【讨论】:

  • 你是对的,当事务超时时,它标记为回滚。以下是来自 messages.log 的错误消息。有没有办法捕捉到下面的异常。 catch 块(异常 e)似乎没有捕获以下异常。并转发给 ChunkStepControllerImpl 调用 writer 和 reader 的 close() 方法。
  • com.ibm.tx.jta.embeddable.impl.EmbeddableTimeoutManager I WTRN0006W: Transaction 000001687C0F80A600000001702D925054D55D870490BCF110A06AF846023110AA52D81C000001687C0F80A600000001702D925054D55D870490BCF110A06AF846023110AA52D81C00000001 has timed out after 900 seconds. [1/23/19 14:08:37:336 EST] 0000009b com.ibm.tx.jta.embeddable.impl.EmbeddableTimeoutManager I WTRN0124I:超时发生时,与事务关联或最近关联的线程是 Thread[Default Executor-thread-90,5,Default Executor Thread Group]。
  • WTRN0006W 加上 WTRN0124I 消息显示线程超时的堆栈跟踪,但此堆栈跟踪不是异常堆栈跟踪。如果您对如何编写 Java 代码来处理这个问题有疑问,我建议您创建一个新问题,并在示例 Java 代码中包含相关详细信息。
猜你喜欢
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2012-08-27
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多