の場所を設定する方法を知りたいObjectStore
ですJTA
。ターゲットはヘリドンMP。現在、現在のディレクトリの下に " ObjectStore
" および " PutObjectStoreDirHere
" という名前のディレクトリが自動的に作成されます。また、トランザクションを管理するために本当に 2 つのディレクトリが必要かどうかも確認したいと思います。
2 に答える
これらのディレクトリ名は、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.dir
user.home
java.home
その順序で処理しようとします (ほとんどの場合、これも存在しません)。最後にクラスパス リソースとして。だから私たちの答えがあります:jbossts-properties.xml
がクラスパス リソースとして存在する場合、 Narayana によってオブジェクト ストア ディレクトリが作成および配置される場所のソースとして使用されます。
では、この XML ファイルはどのように見えるでしょうか。サンプル ファイルはhttps://github.com/jbosstm/narayana/blob/master/ArjunaJTA/narayana-jta/src/main/resources/jbossts-properties.xmlにあります。このようなものが最終的にどこPutObjectStoreDirHere
から来るのかがわかります。したがって、これらのいずれかを上記の場所のいずれかに設定すると、オブジェクトストアを好きな場所に配置できると思います。
PutObjectStoreDirHere
ただし、これはどこから来たのかという質問には答えますが、単純にどこから来たのかという質問には答えていないように見えるため、少し奇妙になりますObjectStore
。againのソース コードを見ると、objectStoreDir
これがBean プロパティのデフォルト値であるように見えるので、他のプロパティが関与している可能性があると推測します。ObjectStoreEnvironmentBean
前に述べたように、私はナーラーヤナの専門家ではないので、ナーラーヤナの人々と連絡を取って、ここですべてのエッジ ケースの詳細を確認することをお勧めします。
Narayana のドキュメントによると、次のシステム プロパティのいずれかを設定できます。
- ObjectStoreEnvironmentBean.objectStoreDir
- 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 は、ここでは付加価値を提供するものではありません。