ejb-3.1 - EJB 计时器服务: WTRN0006W: 事务 xxxx 在 120 秒后超时
问题描述
我们有 4 个计时器作业,每天在不同的时间运行。为此,我们使用具有 4 个线程的内部默认持久定时器调度程序。在这个批处理作业中,我们检索许多 DB2 表的内容,然后将每个表数据存储在远程服务器或 IBM Cloud Object Store 中的文件中。我们注意到的是,如果任何一个外部资源(如远程服务器的 DB2 或 SFTP,或 IBM COS)在 120 秒之前响应,我们会得到以下异常:
WTRN0124I: When the timeout occurred the thread with which the transaction is, or was most recently, associated was
Thread[WebSphere_EJB_Timer_Service_WorkManager.Alarm Pool : 0,5,WebSphere_EJB_Timer_Service_WorkManager: WAS Scheduler:
WebSphere_EJB_Timer_Service]. The stack trace of this thread when the timeout occurred was:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.socketRead(SocketInputStream.java:127)
java.net.SocketInputStream.read(SocketInputStream.java:182)
java.net.SocketInputStream.read(SocketInputStream.java:152)
发生这种情况时,批处理作业将继续处理下一个表,但是当它处理完所有表后,它会再次重新启动同一个作业。我们想停止批处理作业的重新启动。你能帮助我们如何做到这一点。
解决方案
有几种不同的方法可以实现所需的行为:
1) 增加 bean 的事务超时,使 timer 方法成功完成。这是在ibm-ejb-jar-ext.xml
部署描述符文件中完成的,看起来像这样将事务超时增加到 600 秒:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-ext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://websphere.ibm.com/xml/ns/javaee"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-ext_1_0.xsd" version="1.0">
<session name="<your timer bean name>">
<global-transaction transaction-time-out="600"/>
</session>
</ejb-jar-ext>
注意:您还需要增加服务器的最大事务超时时间:https ://www.ibm.com/support/knowledgecenter/en/SSNGTE_7.1.0/com.ibm.tspm.doc_7.1/install/任务/ConfigureTransactionLifetimeTimeout.html
2) 更改 bean 超时方法以不使用事务:
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
3) 将 bean 更改为使用 bean 管理的事务,然后要么不使用事务,要么在 UserTransaction 上设置事务超时:
@TransactionManagement(TransactionManagementType.BEAN)
userTransaction.setTransactionTimeout(600);
userTransaction.begin();
4) 将 EJB TimerService 配置为不重试。计时器方法可能仍然超时,因此在技术上会失败,但不会被容器重试。不幸的是,这仅适用于非持久性计时器,方法是设置如下所述Maximum number of retries
:https ://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc /ae/uejb_timerservice.html
推荐阅读
- amazon-web-services - 在 AWS ECS 上存储 GOOGLE_APPLICATION_CREDENTIALS json 的最佳方式
- snowflake-cloud-data-platform - 雪花中有关 util_db 的任何好的文档
- sap - Hybris 上的 ycommerce:testId 用途是什么(SAP CX Commerce)
- unix - 将 UNIX 命令的结果分配给变量
- angular - “在收到握手响应之前连接已关闭”尝试使用 websockets 将 Angular 与 Spring 连接时
- google-cloud-storage - 无法使用 dialogflow 播放 .mp3 文件
- android - 通过 Xcode 将 Flutter android 应用部署到 ios
- azure - 修改 Azure B2C 登录 V1 策略/用户流最小密码长度限制
- pine-script - 如何在 Pinescript 上获得 1 分钟蜡烛的 8 小时累积 TWAP?
- php - 以下PHP脚本的执行流程是什么?