JBOSS-AS定义组件加载的顺序

时间:2015-12-21 14:00:22

标签: java hibernate jboss esb jboss-esb

我正在研究一些没有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引起的?

更新

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

  • 部署两个ESB并且没有错误
  • 关闭服务器,使用始终绑定的无状态bean重新部署ESB,然后另一个ESB抛出错误
  • 重新启动服务器,一切正常

更新2

记录根JNDI上下文列表表明,在成功部署时,持久性单元在JNDI上下文中可用。

更新3

我有一个解决方案,我认为这是一种解决方法,而不是修复方法。通过将以下内容添加到放置在包的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之前加载持久性单元?

注意:

  • 两个ESB彼此独立部署
  • hibernate core 3.3.2.GA
  • JBOSS SOA-P 5.3

0 个答案:

没有答案