为什么我在 Apache Karaf 4.0.4 中得到 "is not a NamedXAResource"?

Why am I getting "is not a NamedXAResource" in Apache Karaf 4.0.4?

我有一些 transactional code 在旧版本的 Apache Karaf 中运行良好。现在在 Apache Karaf 4.0.4 中我看到了很多异常。

java.lang.IllegalStateException: Cannot log transactions as org.apache.derby.jdbc.EmbedXAResource@77cbf3e5 is not a NamedXAResource.

org.apache.aries.transaction.manager - 1.3.0 |请更正集成并提供 NamedXA java.lang.IllegalStateException: 无法将事务记录为 TransactionContext{transactionId=null,connection=ActiveMQConnection

我找到了答案,post 把它放在这里是为了让其他人更快地解决同样的问题。我花了很长时间,在 Guillaume 的帮助下才弄明白。

在 Aries 事务管理器包内的 Apache Karaf 中使用的 geronimo 事务管理器可以恢复事务。默认情况下,此功能在较旧的 karaf 版本中处于关闭状态。在 Apache Karaf 4.0.4 中,这已经改变。

配置 etc/org.apache.aries.transaction.cfg 包含此设置

aries.transaction.recoverable = true

激活恢复支持。这样做的缺点是所有 jdbc 和 jms 连接都必须实现 NamedXAResource。这超出了标准,因此大多数 jdbc 和 jms 提供商不支持这一点。

ActiveMQ 的解决方案是使用 JCAPoolingConnectionFactory。对于 jdbc,您可以使用 aries 事务 jdbc 包装 XADataSource。它提供了也支持恢复的池化支持。

如果您对应用程序的工作方式感到满意,则可以简单地将上述开关设置回 false。然后事务将像在旧的 Apache Karaf 版本中一样工作。