根据我最近的问题,我们在向包含JPA / EJB jar文件的同一Glassfish4服务器部署多个应用程序战争时遇到问题。目前,我们在每场战争中都包含了jar文件。
我们编写了一个简单的测试servlet,它将记录插入数据库。我们可以重新加载,重新部署(相同的战争)和取消部署/部署(相同的战争)应用程序,每次JPA的东西工作没有错误/重新启动服务器。
我们有另一个应用程序是RESTFul服务(Jersey),如果我们重新加载,我们在访问JPA服务bean时会遇到此异常:
java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManagerFactory.
如果我们重新部署应用程序(使用相同的战争)并尝试访问服务bean,我们会收到此错误:
Caused by: java.lang.IllegalArgumentException: Object: Change ID=ABCD is not a known entity type.
其中“ABCD”是传递给Batch实体的setChangeId()方法的值。
我发现这个Glassfish错误(应该在v4中修复,但似乎不是)https://java.net/jira/browse/GLASSFISH-17295,它表明解决方法是执行完全取消部署/部署。完成后,我们得到相同的IllegalArgumentException。
在所有这些错误情况下,必须重新启动服务器才能使应用程序再次运行
在没有重新加载/重新部署问题的测试应用程序与另一个之间必定存在不同之处,但我找不到它。这两个应用程序都包含相同的EJB / JPA jar文件。这两个应用程序都像这样注入服务bean:
@EJB
private transient DataService dataService;
我们在JPA服务bean中注入EntityManager,如下所示:
@PersistenceContext(unitName = "data")
private EntityManager em;
我还应该注意另外一点什么?
的persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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">
<persistence-unit name="data" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/data</jta-data-source>
<properties>
<!-- disable ddl generation -->
<property name="eclipselink.ddl-generation" value="NONE"/>
<!-- log sqls executed in server.log -->
<property name="eclipselink.logging.level" value="INFO" />
<!-- Instruct EclipseLink to not log execeptions it throws. Lets the application decide about it -->
<property name="eclipselink.logging.exceptions" value="false" />
</properties>
</persistence-unit>
</persistence>
更新
我遇到一个网页,暗示管理控制台应用程序中存在用于重新部署应用程序的错误,并且使用asadmin CLI应该可以正常工作。所以,我尝试以这种方式部署/取消部署,但仍然有相同的错误。