我想知道如何为ObjectStore
配置JTA
的位置。我的目标是Helidon MP。
当前,名为“ ObjectStore
”和“ PutObjectStoreDirHere
”的目录是在当前目录下自动创建的。另外,我想确保我们是否真的需要两个目录来管理事务。
答案 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()
method。 FileLocator#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,您可以设置以下系统属性之一。
就像在
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 在这里或任何地方都不是真正的增值。