1

我想知道如何配置ObjectStorefor的位置JTA。我的目标是 Helidon MP。目前名为“ ObjectStore”和“ PutObjectStoreDirHere”的目录会在当前目录下自动创建。另外我想确定我们是否真的需要两个目录来管理事务。

4

2 回答 2

1

这些目录名称是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.homejava.homeSystem 属性的路径(几乎可以肯定这也不存在),并且最后作为类路径资源。于是就有了我们的答案:jbossts-properties.xml,如果作为类路径资源存在,将用作 Narayana 创建和定位对象存储目录的源

现在,这个 XML 文件是什么样的?似乎可以在此处找到示例文件:https ://github.com/jbosstm/narayana/blob/master/ArjunaJTA/narayana-jta/src/main/resources/jbossts-properties.xml 。你可以看到这样的东西最终是PutObjectStoreDirHere从哪里来的。因此,我认为如果您在上面详述的位置之一设置其中之一,您可以将对象存储放置在您想要的任何位置。

然而,事情变得有点奇怪,因为虽然这回答了PutObjectStoreDirHere从哪里来的问题,但它似乎并没有简单地回答从哪里来的问题ObjectStore如果我们再次查看 的源代码,我们可以看到这似乎是objectStoreDirbean 属性的默认值,所以我在这里的猜测是可能涉及到其他一些属性。ObjectStoreEnvironmentBean

如前所述,我不是 Narayana 专家,因此最好与 Narayana 人员联系,以了解有关此处所有边缘情况的所有详细信息。

于 2019-12-02T18:30:18.873 回答
0

根据Narayana 文档,您可以设置以下系统属性之一。

  1. ObjectStoreEnvironmentBean.objectStoreDir
  2. 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 在这里或任何地方都不是真正的增值。

于 2021-06-22T13:30:03.197 回答