永远不会结束启发式参与者的定期恢复

Phi*_*all 8 oracle xa wildfly ibm-mq

几天来,我们的日志已经充满了这条消息

2018-06-15 12:19:23 WARN [com.arjuna.ats.arjuna] (Periodic Recovery) Transaction 0:ffff0a983f1e:1f3aa2ff:5a09aa02:d1c08c has 1 heuristic participant(s)!
2018-06-15 12:19:23 WARN [com.arjuna.ats.jta] (Periodic Recovery) ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecord < resource:null, txid:< formatId=131077, gtrid_length=46, bqual_length=36, tx_uid=0:ffff0a983f1e:1f3aa2ff:5a09aa02:d1c08c, node_name=acme_node, branch_uid=0:ffff0a983f1e:1f3aa2ff:5a09aa02:d1c08d, subordinatenodename=null, eis_name=unknown eis name >, heuristic: TwoPhaseOutcome.FINISH_OK com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord@6569a57c >
2018-06-15 12:19:23 WARN [com.arjuna.ats.arjuna] (Periodic Recovery) Transaction 0:ffff0a983f1e:1f3aa2ff:5a09aa02:d1c08c restored heuristic participant XAResourceRecord < resource:null, txid:< formatId=131077, gtrid_length=46, bqual_length=36, tx_uid=0:ffff0a983f1e:1f3aa2ff:5a09aa02:d1c08c, node_name=acme_node, branch_uid=0:ffff0a983f1e:1f3aa2ff:5a09aa02:d1c08d, subordinatenodename=null, eis_name=unknown eis name >, heuristic: TwoPhaseOutcome.FINISH_OK com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord@6569a57c >
Run Code Online (Sandbox Code Playgroud)

它始终是相同的Xid.有办法解决这个问题吗?我们正在考虑优雅地关闭应用程序并删除data/tx-object-store中的文件.这是一个好主意吗?

这与WildFly 11有关.我们使用Oracle 12c和IBM WebSphere MQ设置了XA事务.我们正在从消息驱动的bean到JDBC进行XA事务.

Phi*_*all 2

我在2.4.1中找到了问题的答案。假设交易指南已完成。

如果在事务协调器告诉 XAResource 提交之后但在更新事务日志以删除参与者之前事务环境中发生故障,则恢复将尝试重播提交。对于序列化 XAResource,来自 XAResource 的响应将使参与者能够从日志中删除,当所有参与者都提交后,日志最终将被删除。但是,如果 XAResource 不可恢复,则任何 XAResourceRecovery 实例都不太可能向恢复子系统提供新的 XAResource 以用于尝试恢复;在这种情况下,恢复将不断失败,并且日志条目将永远不会被删除。

此问题有两种可能的解决方案:

依靠相关的 ExpiryScanner 最终将日志移动到其他地方。然后需要手动干预以确保可以安全删除日志。如果移动了日志条目,将输出适当的警告消息。

将 com.arjuna.ats.jta.xaAssumeRecoveryComplete 设置为 true。每当无法从任何已注册的 XAResourceRecovery 实例中找到新的 XAResource 实例时,就会检查此选项。如果为 false(默认值),则恢复假定 XAResourceRecovery 实例存在暂时性问题(例如,并非所有实例都已向子系统注册),并将定期尝试恢复。如果为 true,则恢复假定先前的提交尝试已成功,并且可以从日志中删除此实例,而无需进一步尝试恢复。此选项是全局的,因此需要小心使用,因为如果使用不正确,XAResource 实例可能会保持未提交状态。