0

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

耳朵描述符 (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 被绑定了 3 次——每个应用程序都绑定了 1 次。

这与文档http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html一致

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

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

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

4

3 回答 3

2

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

Liberty 和完整概要 WebSphere 的这种行为是相同的。如果在完整配置文件 WebSphere 上的行为似乎有所不同,则可能是由于打包中的另一个限制。例如,如果您将单例类打包在包含一个ejb-jar.xml文件的 WAR 或 JAR 中,metadata-complete=true并且该文件没有将单例定义为 EJB,那么它将被忽略。类似地,如果您将单例打包到版本为 2.5 或更早版本的 WAR 模块中,则 WAR 模块将不支持包含 EJB,并且单​​例将被忽略。

于 2017-05-10T19:02:48.380 回答
2

呸!

问题原来是对 pom.xml 中的 EJB 存档的错误配置的 Maven 依赖项。本来应该提供的依赖被设置为编译依赖——这导致 Maven 将 EJB jar 打包到两个 war 文件中。

我在两个 Web 应用程序中都对其进行了更改——现在单例只为整个耳朵实例化一次。

如果其他人正在解决这个问题,请确保您的依赖项是这样创建的:

<dependency>
  <groupId>com.acme.myapp</groupId>
  <artifactId>myapp-ejb</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <type>ejb</type>
  <scope>provided</scope>
</dependency>
于 2017-05-11T10:02:32.153 回答
0

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

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

于 2017-05-10T17:17:35.247 回答