【问题标题】:Is there any way to change the location of ObjectStore and PutObjectStoreDirHere when enabling JTA on Helidon MP?在 Helidon MP 上启用 JTA 时,有什么方法可以更改 ObjectStore 和 PutObjectStoreDirHere 的位置?
【发布时间】:2019-11-28 16:21:49
【问题描述】:

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

【问题讨论】:

    标签: helidon narayana


    【解决方案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 按此顺序(几乎可以肯定这也不存在),最后是 @ 987654334@。所以我们的答案是: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 来自哪里的问题。我们可以看到这似乎是objectStoreDir bean 属性if we look at the source code of ObjectStoreEnvironmentBean again 的默认值,所以我的猜测是可能涉及到其他一些属性。

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

    【讨论】:

    • 谢谢!根据您的调查,我还尝试了一些配置设置,最后我得出结论<entry key="ObjectStoreEnvironmentBean.objectStoreDir">ObjectStore</entry> 应该是适当的配置,尽管我们必须接受默认目录位置。两个创建的目录似乎没有理由必须不同。
    【解决方案2】:

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

    【讨论】:

    • 值得注意的是,如果您有 @Transactional,则根据规范需要提供 JTA 实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多