1

の場所を設定する方法を知りたいObjectStoreですJTA。ターゲットはヘリドンMP。現在、現在のディレクトリの下に " ObjectStore" および " PutObjectStoreDirHere" という名前のディレクトリが自動的に作成されます。また、トランザクションを管理するために本当に 2 つのディレクトリが必要かどうかも確認したいと思います。

4

2 に答える 2

1

これらのディレクトリ名は、Helidon の JTA サポートの基礎となるNarayana トランザクション エンジンによって提供される特定のディレクトリのデフォルト名です。

私はナーラーヤナの専門家ではありませんが、彼らのソース コードを見ると、ある時点で のインスタンスを構築しようとしているように見えますObjectStoreEnvironmentBean。ご覧のとおり、 という getter メソッドがありgetObjectStoreDir()ます。最終的に、これにより Narayana にオブジェクト ストア ディレクトリの名前が付けられます。

さて、これはどのように入力されるのでしょうか? 繰り返しになりますが、Narayana のソース コードを見ると、このインスタンスはBeanPopulator. 具体的には、BeanPopulatorはプロパティのデフォルト セットを取得し、構成ObjectStoreEnvironmentBean中の Bean にそれらを適用します (この場合)。これにより、(特に) オブジェクト ストア ディレクトリの名前が提供されます。

わかりましたが、これらのプロパティはどこから来たのでしょうか? プロパティのデフォルト セットは、(最終的には)AbstractPropertiesFactoryクラスによって配置されているようです。具体的には、そのinitDefaultPropertiesメソッドは特定の種類の XML ファイルを探してロードします。

どのような種類の XML ファイルを検索しますか? 問題の XML ファイルのパスに解決されるという名前com.arjuna.ats.arjuna.common.propertiesFileのシステム プロパティがある場合、それが使用されるようです。そのようなシステム プロパティがない場合は、代わりにからの戻り値ConfigurationInfo#getPropertiesFile()が使用されていることがわかります。

やや奇妙なことに、Narayana のビルド中に(!)、そのメソッドのバイトコードが からのレシピに置き換えられ (!)、pom.xml最終的に答えがわかりました。このメソッドの戻り値は、正確にjbossts-properties.xml.

もちろん、これはある種の相対パスか、おそらくクラスパス リソースです。それはどれですか?そのためには、クラスに戻って、AbstractPropertiesFactoryその名前がどのように使用されているかを確認する必要があります。メソッド介してさまざまな場所で検索されていることがわかりますFileLocator#locateFile()。このFileLocator#locateFile()メソッドは、最初に名前を絶対パス (絶対パスでjbossts-properties.xmlはないことは明らかです) として処理し、次におよびシステム プロパティに対する相対パスとしてuser.diruser.homejava.homeその順序で処理しようとします (ほとんどの場合、これも存在しません)。最後にクラスパス リソースとして。だから私たちの答えがあります:jbossts-properties.xmlがクラスパス リソースとして存在する場合、 Narayana によってオブジェクト ストア ディレクトリが作成および配置される場所のソースとして使用されます

では、この XML ファイルはどのように見えるでしょうか。サンプル ファイルはhttps://github.com/jbosstm/narayana/blob/master/ArjunaJTA/narayana-jta/src/main/resources/jbossts-properties.xmlにあります。このようなものが最終的にどこPutObjectStoreDirHereから来るのかがわかります。したがって、これらのいずれかを上記の場所のいずれかに設定すると、オブジェクトストアを好きな場所に配置できると思います。

PutObjectStoreDirHereただし、これはどこから来たのかという質問には答えますが、単純にどこから来たのかという質問には答えていないように見えるため、少し奇妙になりますObjectStoreagainのソース コードを見ると、objectStoreDirこれがBean プロパティのデフォルト値であるように見えるので、他のプロパティが関与している可能性があると推測します。ObjectStoreEnvironmentBean

前に述べたように、私はナーラーヤナの専門家ではないので、ナーラーヤナの人々と連絡を取って、ここですべてのエッジ ケースの詳細を確認することをお勧めします。

于 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 を呼び出す良い方法がないため、それに対処する必要があります。

私にとってより大きな問題は、@Transaction でトランザクションを開いたり閉じたりすることだけを望んでいるのに、なぜノイズの多い JTA 実装が必要なのかということです。JTA は、ここでは付加価値を提供するものではありません。

于 2021-06-22T13:30:03.197 に答える