2017-05-10 42 views
0

我正在开发一个封装在耳朵中的企业应用程序。耳朵由一个Enterprise Bean应用程序(在jar中),一个JAX-RS应用程序(在战争中)和一个web应用程序(也在战争中)组成。WebSphere Liberty启动多个单例EJB实例

耳描述符(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一些重要的设置?

回答

0

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

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

+0

的唯一事情是:我越去想它,所记录的功能没有太大的意义时,您将整个应用程序打包在耳边。你通常只需要一个实例 - 为什么要把所有东西打包在一起并使用Singleton? – danishrulez

2

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

此行为对于Liberty和完整概要文件WebSphere都是相同的。如果整个配置文件WebSphere看起来行为不同,那很可能是由于打包的另一个限制。例如,如果将单例类打包在WAR或JAR中,该WAR或JAR包含ejb-jar.xml文件,并且该文件没有将单例定义为EJB,则它将被忽略。同样,如果将单例打包到版本为2.5或更低版本的WAR模块中,那么WAR模块将不支持包含EJB,并且Singleton将被忽略。

+0

我想我可能没有足够好地描述这种情况:singleton bean类只打包在EJB模块中的一个位置。任何项目中都没有ejb-jar.xm。所有EJB都被注释。其他模块使用@EJB注释根据需要注入会话bean,并且不定义它们自己的EJB。 – danishrulez

2

呃!

问题原来是在pom.xml中对EJB归档文件进行了错误配置的Maven依赖关系。应该有一个PROVIDED的依赖被设置为一个COMPILE依赖 - 并且这导致Maven将EJB jar打包成两个war文件。

我在两个Web应用程序中都改变了它 - 现在单身人士只为整个耳朵实例化一次。

如果enybody其他战斗此问题,请确保您的依赖性,这样创建:

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