在Helidon MP上启用JTA时,有什么方法可以更改ObjectStore和PutObjectStoreDirHere的位置吗?

时间:2019-11-28 16:21:49

标签: helidon narayana

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

2 个答案:

答案 0 :(得分:1)

这些目录名称是Narayana transaction engine提供的某些目录的默认名称,这些目录是Helidon的JTA支持的基础。

我不是Narayana专家,但是从他们的source code看,他们似乎将在某个时候构造ObjectStoreEnvironmentBean的实例。如您所见,它有一个名为getObjectStoreDir()的getter方法。最终,这将为Narayana提供对象存储目录的名称。

现在,如何填充?同样,通过查看Narayana源代码,似乎该实例将通过称为BeanPopulator的方式进行填充。具体来说,BeanPopulator将获取一组默认属性,然后将它们应用于配置中的Bean(在这种情况下为ObjectStoreEnvironmentBean),并将提供对象存储目录的名称(除其他外) )。

好的,但是这些属性从何而来?似乎AbstractPropertiesFactory类(最终)位于属性的默认集合。具体来说,其initDefaultProperties method将查找一种特定类型的XML文件并进行加载。

它将查找哪种XML文件?看起来好像有一个系统属性named com.arjuna.ats.arjuna.common.propertiesFile,它将解析为所讨论的XML文件的路径,它将被使用。如果没有这样的System属性,那么我们可以看到使用了the return value from ConfigurationInfo#getPropertiesFile()

有些奇怪的是,在Narayana的构建期间(!),该方法的字节码被({)替换为pom.xml的配方,最后我们可以看到答案:此方法的返回值正好是jbossts-properties.xml

当然,这是某种相对路径,或者也许是类路径资源。哪有为此,我们必须返回到AbstractPropertiesFactory类,并注意如何使用该名称。我们can see that it is sought in various locations via the FileLocator#locateFile() methodFileLocator#locateFile() method首先尝试将名称视为绝对路径(显然我们可以看到jbossts-properties.xml不是绝对路径),然后按该顺序as a path relative to the user.dir, user.home and java.home System properties(几乎可以肯定不存在)两者之一),最后是as a classpath resource。因此,有一个答案: jbossts-properties.xml(如果作为类路径资源存在)将用作Narayana应该在其中创建和定位对象存储目录的源。

现在,这个XML文件是什么样的?似乎可以在此处找到示例文件:https://github.com/jbosstm/narayana/blob/master/ArjunaJTA/narayana-jta/src/main/resources/jbossts-properties.xml。您会看到类似ultimately where PutObjectStoreDirHere comes from的内容。因此,我认为,如果您在上面详述的位置之一中设置了其中之一,则可以将对象存储放置在所需的任何位置。

事情变得有些奇怪,因为虽然这回答了PutObjectStoreDirHere来自何处的问题,却似乎没有回答ObjectStore来自何处的问题,简而言之,{{1} }来自。我们可以看到,这似乎是objectStoreDir bean属性if we look at the source code of ObjectStoreEnvironmentBean again的默认值,所以我的猜测是可能还涉及其他一些属性。

如前所述,我不是Narayana专家,所以最好与Narayana人士取得联系,以了解有关此处所有极端情况的所有细节。

答案 1 :(得分:0)

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

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