我正在研究一些没有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/
我有两个独立的ESB,它们共享相同的数据源和持久性单元,并且都使用无状态bean。
对于META-INF目录和在META-INF目录中,persistence.xml都是相同的:
<?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>
如何控制加载顺序,以便始终首先加载持久性单元?或者这不是加载顺序问题,而是由可能两个共享相同持久性单元的ESB引起的?
我可以通过以下步骤重现错误:
记录根JNDI上下文列表表明,在成功部署时,持久性单元在JNDI上下文中可用。
我有一个解决方案,我认为这是一种解决方法,而不是修复方法。通过将以下内容添加到放置在包的META-INF文件夹中的deployment.xml
文件,强制ESB正在断开依赖于正在工作的ESB(共享相同的持久性单元和数据源): / p>
<?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,而工作的则没有;但是查看该项目的源代码并没有立即产生任何答案。
可能的原因是什么意味着JBOSS / Hibernate在ESB之前加载持久性单元?
注意: