WebSphere Liberty启动多个单例EJB实例

时间:2017-05-10 16:22:02

标签: singleton websphere-liberty ejb-3.2

我正在开发一个包装在耳中的企业应用程序。耳朵包括一个Enterprise Bean应用程序(在jar中),一个JAX-RS应用程序(在战争中)和一个Web应用程序(也在战争中)。

ear描述符(application.xml)如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
    "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
    "http://java.sun.com/dtd/application_1_3.dtd">
<application>
  <display-name>myapp-ear</display-name>
  <module>
    <web>
      <web-uri>myapp-war-1.0.0-SNAPSHOT.war</web-uri>
      <context-root>/</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>myapp-rest-1.0.0-SNAPSHOT.war</web-uri>
      <context-root>/api</context-root>
    </web>
  </module>
  <module>
    <ejb>myapp-ejb-1.0.0-SNAPSHOT.jar</ejb>
  </module>
</application>

EJB应用程序包含一个单独的EJB,使用@Singleton,@ LocalBean和@Startup进行注释,其中包含@Schedule方法。

我在日志中注意到服务器同时启动了调度方法的三个实例,并且对日志的进一步调查显示bean被绑定三次 - 一个用于耳中的每个应用程序。

这符合文档http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html

但是:我在完整的配置文件WebSphere服务器上运行的类似应用程序没有显示此行为。相反,整个企业应用程序只存在一个实例。

WLP服务器运行17.0.0.1,Java版本为1.8.0_101

问题是,如果这是一个错误 - 或者我错过了WLP中的一些重要设置?

3 个答案:

答案 0 :(得分:2)

类不确定EJB的唯一标识。每个EJB都有一个由<app name>/<module name>/<bean name>组成的3部分唯一标识符。因此,如果相同的类打包在3个位置,那么将有3个单独的EJB定义。此外,您可以将EJB类打包在一个位置,但如果您从3个单独的ejb-jar.xml文件中将其标识为EJB(假设该类位于共享位置),则仍然有3个。所有EJB类型都是如此,但单例可以使行为更加明显。

Liberty和完整配置文件WebSphere的这种行为是相同的。如果看起来完整配置文件WebSphere的行为不同,则可能是由于包装中的另一个限制。例如,如果将单例类打包在包含带有ejb-jar.xml的{​​{1}}文件的WAR或JAR中,并且该文件未将单例定义为EJB,则会忽略它。类似地,如果将单例打包在版本为2.5或更旧的WAR模块中,则WAR模块将不支持包含EJB,并且将忽略Singleton。

答案 1 :(得分:2)

咄!

问题原来是pom.xml中对EJB存档的Maven依赖程序配置不正确。什么应该是一个PROVIDED dependendy被设置为COMPILE依赖 - 这导致Maven将EJB jar打包到两个war文件中。

我在两个网络应用程序中都对它进行了更改 - 现在只对整个耳朵实例化一次单例。

如果enybody正在解决此问题,请确保您的依赖关系是这样创建的:

<dependency>
  <groupId>com.acme.myapp</groupId>
  <artifactId>myapp-ejb</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <type>ejb</type>
  <scope>provided</scope>
</dependency>

答案 2 :(得分:0)

看起来你确实正确地阅读了规范 - 单个bean被强制为“每个JVM每个应用程序一个”。

Liberty似乎符合规范。您在WebSphere传统(也就是完整配置文件)上观察到的行为可能是由于不同的应用程序/ EJB设置,或者超出规范的WebSphere传统特定额外功能,允许您跨多个应用程序限制单例EJB。 / p>