本节说明 Sun GlassFish Enterprise Server v3 中的已知问题及其解决方法(如果有)。
[JDK_Issue] 因调用 setSoLinger 或 setReuseAddress 导致性能降级(问题 7109)
[JDK_ISSUE] Richacess:java.io.IOException:由 doSelect 产生的无效参数(问题 8573)
com.sun.xml.wss.NonceManager.getInstance 抛出 null 指针异常(问题 11138)
[Open Installer] Windows Vista 和 Windows 2008 上“开始”菜单未显示,且随后该菜单为空(问题 5087)
部署 specj 应用程序后,asadmin get --monitor=true "server.*" 会导致 I/O 错误(问题 11163)
Java EE 6 受管 Bean 支持在使用 Java Web Start 启动的应用程序客户端中不可用(问题 11257)
在具有 Apple Java 实现的 Mac OS X 上调用 appclient 脚本时出现警告消息(问题 8644)
内嵌帮助和 CLI 手册页在 X-Powered-By 中列出了不正确的 servlet 版本 2.4(问题 11011)
[Embedded] 使用 uber-jar 部署包含有 activation-1.1.jar 的应用程序时失败(问题 11149)
在 Solaris 上,passwordfile 中没有 AS_ADMIN_USER 时,create-service 无法创建服务(问题 11119)
[Monitoring] 用于 connector-connection-pools 的附加监视视图不可用(问题 11256)
[EclipseLink] 可嵌入部分的 ElementCollections 问题(EclipseLink 问题 296606)
调用 setSoLinger 方法或 setReuseAddess 方法时,会出现性能降级并抛出以下异常:
[#|2009-01-26T00:33:56.325-0800|WARNING|sun-appserver9.1| javax.enterprise.system.container.web|_ThreadID=17; _ThreadName=SelectorReaderThread-8084; _RequestID=11ae0030-c392-4217-8408-cfa7efe0a879;|setSoLinger exception java.net.SocketException: Invalid argument |
该问题是由 JDK 软件的问题所导致的。JDK 版本 7 中已解决该问题。
有关更多信息,请参见问题报告。
无。
重新启动 Enterprise Server 有时会导致抛出 null 指针异常。
SEVERE: doSelect exception java.lang.NullPointerException |
该问题是由 JDK 软件的问题所导致的。JDK 版本 7 中已解决该问题。
有关更多信息,请参见问题报告。
无。
在 HTTP 生命期测试期间,连续运行 42 小时后抛出以下异常:
[#|2009-04-05T17:41:26.537-0700|SEVERE|glassfish|javax.enterprise.system.core| _ThreadID=15;_ThreadName=Thread-1;|doSelect exception java.io.IOException: Invalid argument |
在运行期间仍可访问实例和应用程序。
该问题是由 JDK 软件的问题所导致的。JDK 版本 7 中已解决该问题。
有关更多信息,请参见问题报告。
无。
在启动时,Enterprise Server 会抛出 null 指针异常:
java.lang.NullPointerException at sun.nio.ch.Util.atBugLevel(Util.java:326) at sun.nio.ch.SelectorImpl.<init>(SelectorImpl.java:40) at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:47) |
该问题与 Grizzly 有关,是 JDK 6 的问题。JDK 7 中已解决该问题。
有关更多信息,请参见问题报告。
无。Grizzly 尝试解决该问题,但该问题仍可能发生。
会产生以下异常:
[#|2009-06-20T06:05:57.942-0700|SEVERE|glassfish| com.sun.grizzly.config.GrizzlyServiceListener| _ThreadID=21;_ThreadName=Thread-2;|doSelect IOException java.io.IOException: Invalid argument |
这是 JDK 的问题,计划在 JDK 1.6.0_18 中修复。
有关更多信息,请参见问题报告。
将文件描述符的最大数量增加至 10000 或更多(Solaris 中默认为 64000)。JDK 1.6.0_18 一经发布,请立即安装。
如果域的 /applications 目录存在访问限制,或者使用的是来自受限目录的目录部署,则服务器无法读取扩展目录中的文件。部署期间会出现 NullProcessException 错误。
有关更多信息,请参见问题报告。
更改此类目录的文件访问设置,以授予服务器读取目录内容的权限。
time-stamp-install.log 文件无法读取,因为所有写入到该文件的行全部串连到了单个长字符串中。
有关更多信息,请参见问题报告。
换用其他编辑器,然后手动打开 %TEMP% 目录下创建的安装日志文件。
只有在重新启动服务器之后,才能监视关于新增虚拟服务器的统计信息。
有关更多信息,请参见问题 6238 和问题 6422 的报告。
添加虚拟服务器后,重新启动服务器以查看虚拟服务器的监视数据。
将用于重定位日志文件的选项 -l与选项 -a 和 -s 一起使用时,该选项会被忽略,并且会在默认位置创建日志文件。
有关更多信息,请参见问题报告。
无。
Windows Vista 上启用用户帐户控制 (User Account Control, UAC) 后,部分功能无法正常工作。例如无法启动管理控制台。
有关更多信息,请参见问题报告。
禁用 UAC 并重新引导。
在启用 GlassFish 消息安全提供者的情况下测试 JAX-RPC Web 服务,会在服务器日志中抛出以下异常:
[#|2009-11-23T11:16:58.375+0005|SEVERE|glassfishv3.0| javax.enterprise.resource.webservices.rpc.server.http|_ThreadID=25;_ ThreadName=http-thread-pool-8080-(2);|caught throwable java.lang.RuntimeException: com.sun.enterprise.security.jauth.AuthException |
nonce 属性的默认值不起作用。
有关更多信息,请参见问题报告。
要在 JAX-RPC Web 服务中使用消息安全,则需要在配置中禁用 nonce 属性。请参见问题报告以获取解决方法的完整步骤。
首次完成安装后未显示 Enterprise Server 的“开始”菜单组。如果注销后重新登录,则会显示菜单组,但是该菜单组为空。
有关更多信息,请参见问题报告。
无。
命令 asadmin get -m "server.*" 会返回与该服务器有关的所有监视数据。在部署很多应用程序后,数据量很大,可能需要很长的时间才能返回。客户端可能超时且出现以下客户端错误:
./asadmin get --monitor=true "server.*" I/O Error: Read timed out Command get failed. |
有关更多信息,请参见问题报告。
尽可能地减少返回至客户端的数据量。
运行 asadmin list -m "server.*" 命令以返回顶层元素。
选择需要详细信息的顶层元素,并将其用作过滤器。例如:
> ./asadmin list -m "server.*" ... server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-cache server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-methods server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-methods. create-int-int-[Lorg\.spec\.jappserver\.supplier\.helper\.ComponentOrder server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-methods. findByPrimaryKey-java\.lang\.Integer server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-methods.generateXml server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-methods.getEJBLocalHome ... >./asadmin get -m "server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-methods.*" ... server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-methods.remove. methodstatistic-name = MethodStatistic server.applications.SPECjAppServer.supplier\.jar.POEnt.bean-methods.remove. methodstatistic-starttime = 1259604209775 ... |
在 Solaris 上安装附加组件时,通过 updatetool 命令启动独立更新工具失败,并且出现段故障。
有关更多信息,请参见问题报告。
确保系统符合 Update Center 发行说明 中定义的独立更新工具修补程序要求。
管理控制台中的更新工具功能使用不同的基于 Java 的 Update Center API,因此不受该问题影响。
如果在上下文根目录 '/' 中部署了 Ruby 应用程序,然后访问管理控制台,则访问 Ruby 应用程序时会产生 404 错误。
有关更多信息,请参见问题报告。
无。
使用 Java Web Start 启动应用程序客户端后,无法识别应用程序客户端中的所有受管 bean。
有关更多信息,请参见问题报告。
使用 appclient 脚本启动应用程序客户端。可正常支持应用程序客户端中的受管 bean。
在已安装 Apple Java 的 Mac OS X 系统上调用 appclient 脚本时,两次出现以下栈跟踪信息(此处仅显示头几行信息):
Intentionally suppressing recursive invocation exception! java.lang.IllegalStateException: recursive invocation at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1394) at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1377) at sun.security.jca.ProviderConfig$1.run(ProviderConfig.java:64) ... |
有关更多信息,请参见问题报告。
不需要。
尽管出现警告消息,客户端仍会成功启动并正常运行。这些错误是由 Apple Java 实现中的问题造成的。
满足以下所有条件时会出现问题:
应用程序为包含应用程序客户端的 EAR。
EAR 为部署的目录。
EAR 包含应用程序客户端模块 myAppClient.jar,而且因为该模块是目录部署,它会预扩展到 myAppClient_jar。(在本示例中,myApp 为 EAR 的名称。它可以是任意名称。)
由于将某个在服务器上生成的文件放置在错误的服务器目录中,并且该文件覆写了另一个生成的文件,因此尝试启动应用程序客户端时会失败,并且出现以下错误:
java.lang.ClassNotFoundException:(main-class-for-the-client) |
有关更多信息,请参见问题报告。
更改应用程序客户端的名称,使其不为 myAppClient.jar。具体而言:
编辑 myApp/META-INF/application.xml,使客户端的声明为 <java>myClient.jar</java>。请注意,可使用 myAppClient.jar 外的任何名称。
将 myApp/myAppClient_jar 目录重命名为 myApp/myClient_jar。请注意,客户端的子目录名称必须与 application.xml 文件中的应用程序客户端 URI 一致,且 _jar 替换掉 .jar。
部署应用程序:
asadmin deploy --retrieve localdir myApp |
运行应用程序客户端:
appclient -client localdir/myAppClient.jar |
在管理控制台中的“Logger Settings”页面的“General”选项卡上对服务器日志值进行的更改不会立即生效。
有关更多信息,请参见问题报告。
重新启动服务器。在此页面上所有对值的更改都需要重新启动服务器才能生效。
图形化安装程序中的安装过程结束时会显示“Summary”页面,无法通过单击该页面上的链接来打开安装日志文件。
有关更多信息,请参见问题报告。
手动访问这些文件。安装日志和摘要文件的名称为 timestamp-install.log 和 timestamp-install-summary.html。在 Linux 和 Mac 系统上,这些文件在 $TMP 目录中生成。
如果在同一安装目录中使用相同的默认值重新安装 Enterprise Server(带有更新工具),然后使用 updatetool 命令调用更新工具,则用户会收到消息,告知用户未安装更新工具,并且询问用户是否进行安装。该问题仅出现在 Windows 系统上。
有关更多信息,请参见问题报告。
在卸载后,手动删除残留的 .org* 目录,然后重新安装。
在 Windows 和 Mac OS 系统上会间歇性地出现该问题。在某些系统上,有时 pkg(5) 会不起作用。
有关更多信息,请参见更新中心问题报告。
无。
内嵌帮助和 CLI 手册页在 X-Powered-By 字段中列出了 servlet 2.4。正确版本应为 servlet 3.0。
有关更多信息,请参见问题报告。
无。
通过 glassfish-embedded-all-3.0-b73.jar 使用嵌入部分时,部署会失败,并且出现以下错误:
SEVERE: WEB9051: Error trying to scan the classes at /private/var/folders/CV/CVhj8DvqEwGK5bdJKK9TaE TI/-Tmp- /gfembed6991712842235699248tmp/applications/xwiki-enterprise-web-2.0/ WEB-INF/lib/activation-1.1.jar for annotations in which a ServletContainerInitializer has expressed interest java.util.zip.ZipException: error in opening zip file |
出现该问题的原因是嵌入部分使用带加号 (+) 的文件夹,而在对路径进行解码时,路径中的加号被转换为空格字符 " "。
有关更多信息,请参见问题报告。
已添加可设置临时目录位置的系统属性。该属性为 glassfish.embedded.tmpdir,可设置为不将临时域目录放置在用户目录中。
在 Solaris 上,passwordfile 中没有 AS_ADMIN_USER 时,create-service 无法创建服务。
有关更多信息,请参见问题报告。
无。
Enterprise Server 使用树结构来跟踪可监视对象。在该树中,获取连接池统计信息时以下视图不可用:
server.connector-service.resource-adapter-name .connection-pool-name .* 或 server.jms-service.connection-factories. connection-factory-name.*(适用于与 jms-ra 相关的池)。
有关更多信息,请参见问题报告。
使用 server.resources.* 视图获取统计信息。
有关监视的更多信息,请参见《Sun GlassFish Enterprise Server v3 Administration Guide》中的第 8 章 “Administering the Monitoring Service”。
启用编织 (weaving) 后,更新可嵌入部分的元素集合时可能抛出 null 指针异常。
有关更多信息,请参见 EclipseLink 问题报告。
有两个可用的解决方法:
在可嵌入部分添加注释 @ChangeTracking(DEFFERED),然后将 eclipselink.weaving.internal 属性设置为 false,或者
在持久性 XML 中将以下属性设置为 false:eclipselink.weaving.changetracking 和 eclipselink.weaving.internal。
启动域并访问 localhost:4848 后,服务器日志中会出现以下消息:
[#|2009-11-27T16:21:57.091+1100|INFO|glassfishv3.0| javax.enterprise.system.container.web.com.sun.enterprise.web| _ThreadID=20;_ThreadName=Thread-1;|Created virtual server server|#] |
[#|2009-11-27T16:21:57.091+1100|INFO|glassfishv3.0| javax.enterprise.system.container.web.com.sun.enterprise.web| _ThreadID=20;_ThreadName=Thread-20;|Created virtual server server|#] |
这些消息会让用户感觉虚拟服务器 server 启动了两次。但事实并非如此。虚拟服务器只启动了一次,但消息却记录了多次。
有关更多信息,请参见问题报告。
无。
因为来自服务器的消息有限,所以很难调试 JPA。
有关更多信息,请参见问题报告。
向 logging.properties 文件添加属性 org.eclipse.persistence.session.level=INFO。然后可使用管理控制台控制 EclipseLink 记录器。
当与目标 EJB 位于同一主机上(另一个 Enterprise Server 域或另一个 Enterprise Server v3 实例)时,远程 EJB 的 EJB 互操作性会中断。
有关更多信息,请参见问题报告。
在 jvm-options 中设置以下属性:
-Dorg.glassfish.orb.iiop.orbserverid=:
在 Windows Vista 和 Windows 7 上进行安装时,Enterprise Server 图形化安装程序会在 41% 处挂起。并非是每次安装时都会出现该问题。
有关更多信息,请参见问题报告。
该问题与 Windows Vista 和 Windows 7 中的自动调整功能相关,默认会启用该功能。
如果在初次安装 Enterprise Server 时或者在添加软件包或应用更新时出现挂起现象,则限制或禁用自动调整功能。
默认情况下,Enterprise Server 上的 JMS 服务的默认主机名为 localhost。可是,要从其他系统访问 JMS 服务时却必须更改主机名。可将其更改为实际主机名或更改为 0.0.0.0。
有关更多信息,请参见问题报告。
要进行更改,可完成以下某个步骤:
使用管理控制台:展开“Configuration”、“Java Message Service”和“JMS Hosts”节点,选择 default_JMS_host,编辑“Host”字段;或者
使用 asadmin 子命令,如下所示:
asadmin set server-config.jms-service.jms-host.default_JMS_host.host="0.0.0.0",或者
asadmin set server-config.jms-service.jms-host.default_JMS_host.host="hostname"
使用图形化安装程序安装 Enterprise Server 时,成功完成安装后仅在 Windows 系统菜单中添加了顶层 GlassFish v3 条目,而且此菜单为空。该问题在本地化安装程序和英文安装程序中都会出现。
有关更多信息,请参见问题报告。
无。
deploy 命令手册页的 --dbvendorname 内支持的数据库列表中没有列出 mysql。这不正确。MySQL 是支持的数据库,应该将其列出。
有关更多信息,请参见问题报告。
无。
ACC 预期当前线程的上下文类加载器为 ACCClassLoader。这过于严格。尽管 appclient 脚本和 Java Web Start 启动满足此条件,但嵌入式功能可能无法满足。ACC 内的其他功能要求类加载器为 URLClassLoader(或 URLClassLoader 的子类的实例),但加载器不需要为 ACCClassLoader。
有关更多信息,请参见问题报告。
有两个可用的解决方法:
设置 -Djava.system.class.loader=org.glassfish.appclient.client.acc.ACCClassLoader,或
在 Java 程序中,实例化 ACCClassLoader 并使用 Thread.currentThread().setContextClassLoader 将其设置为当前线程的上下文类加载器,然后再使用嵌入式 ACC 类和接口。
能够以用户的身份在 MySQL 中创建和存储 EJB 计时器,但当尝试为 MySQL 配置 EJB 计时器服务时,出现以下异常(SQLException 执行语句):
"CREATE TABLE EJB__TIMER__TBL (TIMERID VARCHAR(255) NOT NULL, BLOB BLOB(64000), INITIALEXPIRATIONRAW BIGINT, SCHEDULE VARCHAR(255), INTERVALDURATION BIGINT, OWNERID VARCHAR(255), STATE INTEGER, LASTEXPIRATIONRAW BIGINT, PKHASHCODE INTEGER, CREATIONTIMERAW BIGINT, CONTAINERID BIGINT, PRIMARY KEY (TIMERID))": com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BLOB BLOB(64000), INITIALEXPIRATIONRAW BIGINT, SCHEDULE VARCHAR(255), INTERVALDU' at line 1|#] |
有关更多信息,请参见问题报告。
确保为计时器池指定的 datasource-classname 表示 XA 数据源。
MySQL 特定步骤:
解压缩 glassfishv3/glassfish/lib/install/applications/ejb-timer-service-app.war。
将以下内容添加到 WEB-INF/classes/__ejb_timer_mappings.xml 中的 <persistence-unit-metadata> 之后:
<persistence-unit-defaults> <delimited-identifiers/> </persistence-unit-defaults>
重新打包 WEB-INF/classes/__ejb_timer_mappings.xml 文件。
(只有当前安装已使用 EJB 计时器服务时,才需要此步骤。)在数据库中使用此 create 语句手动创建 EJB__TIMER__TBL:
CREATE TABLE `EJB__TIMER__TBL` (`TIMERID` VARCHAR(255) NOT NULL, `BLOB` BLOB(64000), `INITIALEXPIRATIONRAW` BIGINT, `SCHEDULE` VARCHAR(255), `INTERVALDURATION` BIGINT, `OWNERID` VARCHAR(255), `STATE` INTEGER, `LASTEXPIRATIONRAW` BIGINT, `PKHASHCODE` INTEGER, `CREATIONTIMERAW` BIGINT, `CONTAINERID` BIGINT, PRIMARY KEY (`TIMERID`))
除非使用 --secure 选项,否则 deploy 子命令会在安全服务器上失败。
有关更多信息,请参见问题报告。
对安全服务器发出 deploy 子命令时,使用 --secure 选项。
Enterprise Server truststore 中的某个授权证书将于 2010 年 1 月 7 日过期。该证书为 cacerts.jks。启动时将生成错误消息以表明该证书已过期:
Version: V1 Subject: OU=Secure Server Certification Authority, O="RSA Data Security, Inc.", C=US Signature Algorithm: MD2withRSA, OID = 1.2.840.113549.1.1.2 Key: SunPKCS11-Solaris RSA public key, 1000 bits (id 17891456, session object) modulus: public exponent: Validity: [From: Tue Nov 08 19:00:00 GMT-05:00 1994, To: Thu Jan 07 18:59:59 GMT-05:00 2010] Issuer: OU=Secure Server Certification Authority, O="RSA Data Security, Inc.", C=US SerialNumber: [ 02ad667e 4e45fe5e 576f3c98 195eddc0] |
有关更多信息,请参见问题报告。
已在 Java SE 6 的更新 18 中删除过期的授权证书。该证书还将从 Enterprise Server truststore 将来的更新中删除。
可以忽略该错误消息并使用更新,也可以删除该错误消息。要停止接收错误消息,请使用密钥工具将证书从 Enterprise Server truststore 中删除:
=> cd domains/domainX/config => cp cacerts.jks cacerts.jks.save => keytool -delete -keystore cacerts.jks -alias verisignserverca Enter keystore password: |
要避免在后续创建的域中再次出现过期的证书,还应从模板 truststore 中删除该证书:
=> cd glassfish/lib/templates => cp cacerts.jks cacerts.jks.save => keytool -delete -keystore cacerts.jks -alias verisignserverca Enter keystore password: |
有关密钥库密码的更多信息,请参见《Sun GlassFish Enterprise Server v3 Administration Guide》中的“Authentication”中关于主密码和密钥库的信息。