私は、Bean がバインドされていないというエラーがあるいくつかのレガシー コードに取り組んでいます。これはよくあることのようですが、これまでのところ、オンラインで提供されているすべてのソリューションが機能していません (一般的に、データソースが正しく定義されているか、クラスの読み込みの問題が発生しているかを確認するため)。この問題は、Bean がバインドされる場合とバインドされない場合があるという事実によっても悪化します。
Bean はログにバインドされていると表示されます。
2015-12-21 09:44:56,203 DEBUG [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (main) Bound javax.naming.Reference into JNDI at "MyBean/local"
2015-12-21 09:44:56,203 DEBUG [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (main) Bound javax.naming.Reference into JNDI at "MyBean/local-package.MyBeanInterface"
また、JNDI ツリーでバインドされているものとして表示され、名前はコードで使用されているものと一致します。
しかし、その後
org.jboss.soa.esb.ConfigurationException: javax.naming.NameNotFoundException: MyBean not bound
コンポーネントのロード順序まで原因を追跡したと思います。デプロイが失敗すると、DEBUG ログに次のように表示されます。
2015-12-21 09:44:54,471 DEBUG [org.jboss.deployers.structure.spi.helpers.AbstractDeploymentContext] (main) Added component jboss.j2ee:jar=myesb.esb,name=mybean,service=EJB3_endpoint to vfszip:/jboss-as/server/default/deploy/myesb.esb/
2015-12-21 09:44:54,471 DEBUG [org.jboss.deployers.structure.spi.helpers.AbstractDeploymentContext] (main) Added component jboss.esb.vfszip:jboss-as/server/default/deploy/myesb.esb/ to vfszip:/jboss-as/server/default/deploy/myesb.esb/
2015-12-21 09:44:54,472 DEBUG [org.jboss.deployers.structure.spi.helpers.AbstractDeploymentContext] (main) Added component persistence.unit:unitName=myesb.esb#my-unit to vfszip:/jboss-as/server/default/deploy/myesb.esb/
デプロイが成功すると、DEBUG ログに次のように表示されます。
2015-12-21 11:59:51,331 DEBUG [org.jboss.deployers.structure.spi.helpers.AbstractDeploymentContext] (main) Added component persistence.unit:unitName=myesb.esb#my-unit to vfszip:/jboss-as/server/default/deploy/myesb.esb/
2015-12-21 11:59:51,332 DEBUG [org.jboss.deployers.structure.spi.helpers.AbstractDeploymentContext] (main) Added component jboss.j2ee:jar=myesb.esb,name=mybean,service=EJB3_endpoint to vfszip:/jboss-as/server/default/deploy/myesb.esb/
2015-12-21 11:59:51,333 DEBUG [org.jboss.deployers.structure.spi.helpers.AbstractDeploymentContext] (main) Added component jboss.esb.vfszip:/jboss-as/server/default/deploy/myesb.esb/ to vfszip:/jboss-as/server/default/deploy/myesb.esb/
同じデータソースと永続化ユニットを共有する 2 つの個別の ESB があり、どちらもステートレス Bean を使用しています。
persistence.xml は両方で同じで、META-INF ディレクトリにあります。
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="my-unit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jdbc/MyDS</jta-data-source>
<mapping-file>hibernate.cfg.xml</mapping-file>
<properties>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.default_schema" value="myvalue" />
</properties>
</persistence-unit>
</persistence>
データソース ファイルは次のとおりです。
<local-tx-datasource>
<jndi-name>jdbc/MyDS</jndi-name>
<connection-url>jdbc:postgresql://localhost:5432/mydb</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<user-name>username</user-name>
<password>password</password>
<min-pool-size>5</min-pool-size>
<max-pool-size>25</max-pool-size>
<metadata>
<type-mapping>PostgreSQL</type-mapping>
</metadata>
</local-tx-datasource>
永続ユニットが常に最初にロードされるように、ロードの順序を制御するにはどうすればよいですか? それとも、これは読み込み順序の問題ではなく、2 つの ESB が同じ永続化ユニットを共有していることが原因でしょうか?
アップデート
次の手順でエラーを再現できます。
- 両方の ESB をデプロイし、エラーはありません
- サーバーをシャットダウンし、常にOKをバインドするステートレスBeanを使用してESBを再デプロイすると、他のESBがエラーをスローします
- サーバーを再起動すると、すべて問題ありません
更新 2
ルート JNDI コンテキストのリストをログに記録すると、デプロイが成功すると、永続性ユニットが JNDI コンテキスト内で使用可能になることが示されます。
アップデート 3
修正ではなく回避策と思われる解決策があります。deployment.xml
パッケージの META-INF フォルダーに配置されたファイルに次のコードを追加することで、壊れていた ESB が動作している ESB に依存するように強制します (どちらも同じ永続化ユニットとデータソースを共有します) 。
<?xml version="1.0" encoding="UTF-8"?><jbossesb-deployment>
<depends>jboss.esb:deployment=my-working-esb.esb</depends>
</jbossesb-deployment>
したがって、作業中の ESB は常に最初にデプロイされます。つまり、持続性ユニットは JNDI コンテキスト内の他の ESB で利用できます。ただし、これは永続ユニットが最初にロードされる理由には答えません。パッケージングに関連している可能性があると思いました-壊れたESBはjboss-packaging-maven-pluginを使用しますが、動作するESBは使用しません。しかし、そのプロジェクトのソース コードを見ても、すぐに答えが得られるわけではありません。
JBOSS/Hibernate が ESB の前に永続ユニットをロードすることを意味する考えられる原因は何ですか?
注意:
- 両方の ESB は互いに独立して正常にデプロイされます
- ハイバネート コア 3.3.2.GA
- JBOSS SOA-P 5.3