1

我正在处理一些具有 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

我想我已经将原因追溯到组件加载顺序。在不成功的部署中,调试日志显示:

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。

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>

如何控制加载顺序以便始终首先加载持久性单元?或者这不是加载顺序问题,而是可能由两个 ESB 共享相同的持久性单元引起的?

更新

我可以通过以下步骤重现错误:

  • 部署两个 ESB 并且没有错误
  • 关闭服务器,使用始终绑定好的无状态 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
4

0 回答 0