我想知道如何配置ObjectStore
for的位置JTA
。我的目标是 Helidon MP。目前名为“ ObjectStore
”和“ PutObjectStoreDirHere
”的目录会在当前目录下自动创建。另外我想确定我们是否真的需要两个目录来管理事务。
2 回答
这些目录名称是Narayana 事务引擎提供的某些目录的默认名称,它是 Helidon 的 JTA 支持的基础。
我不是 Narayana 专家,但从查看他们的源代码来看,似乎在某个时候他们将构建一个ObjectStoreEnvironmentBean
. 如您所见,它有一个名为 的getter 方法getObjectStoreDir()
。最终,这将为 Narayana 提供对象存储目录的名称。
现在,这是如何填充的?同样,通过查看 Narayana 源代码,该实例似乎将通过称为 a 的方式填充BeanPopulator
。具体来说,BeanPopulator
将获取一组默认属性,然后将它们应用于配置下的 bean(ObjectStoreEnvironmentBean
在本例中),这将提供对象存储目录的名称(以及其他内容)。
好的,好的,但是这些属性是从哪里来的呢?似乎默认属性集(最终)由AbstractPropertiesFactory
类定位。具体来说,它的initDefaultProperties
方法将查找特定类型的 XML 文件并加载它。
它会查找什么样的 XML 文件?看起来如果有一个名为com.arjuna.ats.arjuna.common.propertiesFile
的系统属性,它解析为相关 XML 文件的路径,它将被使用。如果没有这样的 System 属性,那么我们可以看到使用了 from 的返回值ConfigurationInfo#getPropertiesFile()
。
有点奇怪,在构建 Narayanapom.xml
( !) 期间,该方法的字节码被替换 (!) 为来自jbossts-properties.xml
.
那当然是某种相对路径,或者可能是类路径资源。它是哪一个?为此,我们必须返回AbstractPropertiesFactory
类并注意该名称是如何使用的。我们可以看到通过该FileLocator#locateFile()
方法在各个位置进行了查找。该FileLocator#locateFile()
方法首先尝试将名称视为绝对路径(显然我们可以看到这jbossts-properties.xml
不是绝对路径),然后按顺序将其视为相对于user.dir
,user.home
和java.home
System 属性的路径(几乎可以肯定这也不存在),并且最后作为类路径资源。于是就有了我们的答案:jbossts-properties.xml
,如果作为类路径资源存在,将用作 Narayana 创建和定位对象存储目录的源。
现在,这个 XML 文件是什么样的?似乎可以在此处找到示例文件:https ://github.com/jbosstm/narayana/blob/master/ArjunaJTA/narayana-jta/src/main/resources/jbossts-properties.xml 。你可以看到这样的东西最终是PutObjectStoreDirHere
从哪里来的。因此,我认为如果您在上面详述的位置之一设置其中之一,您可以将对象存储放置在您想要的任何位置。
然而,事情变得有点奇怪,因为虽然这回答了PutObjectStoreDirHere
从哪里来的问题,但它似乎并没有简单地回答从哪里来的问题ObjectStore
。如果我们再次查看 的源代码,我们可以看到这似乎是objectStoreDir
bean 属性的默认值,所以我在这里的猜测是可能涉及到其他一些属性。ObjectStoreEnvironmentBean
如前所述,我不是 Narayana 专家,因此最好与 Narayana 人员联系,以了解有关此处所有边缘情况的所有详细信息。
根据Narayana 文档,您可以设置以下系统属性之一。
- ObjectStoreEnvironmentBean.objectStoreDir
- ObjectStoreEnvironmentBean.localOSRoot
如在
java -DObjectStoreEnvironmentBean.objectStoreDir=/tmp/whatever -jar my-helidon-mp-thing-that-cant-tell-jpa-and-jta-apart.jar
但这只会真正移动“PutObjectStoreDirHere”目录。“ObjectStore”目录在 Narayana 中被硬编码为:
private volatile String objectStoreDir = System.getProperty("user.dir") + File.separator + "ObjectStore";
在 helidon/CDI 中没有很好的方法来插入初始化周期并调用 ObjectStoreEnvironmentBean::setObjectStoreDir 所以,我们只需要忍受它。
对我来说更大的问题是,为什么我们必须有一些嘈杂的 JTA 实现,而实际上所有人都想要 @Transaction 做的是打开和关闭事务。JTA 在这里或任何地方都不是真正的增值。