无法从 Servlet、JSP 文件、独立程序或其他客户机访问企业 Bean
将这些故障诊断技巧用于与访问企业 Bean 有关的问题。
- java.lang.NoSuchMethodError 消息
- 尝试进行访问时出现以下消息:javax.naming.NameNotFoundException: 在上下文“local”中找不到名称 name
- 抛出 BeanNotReentrantException
- 抛出 CSITransactionRolledbackException / TransactionRolledbackException
- 调用失败,在 JVM 日志文件中找到以 EJSContainer E Bean method threw exception [exception_name] 开头的堆栈跟踪。
- 调用失败,在 JVM 日志文件中找到访问有状态会话 EJB 时的 ObjectNotFoundException 或 ObjectNotFoundLocalException。
- 尝试启动 EJB 模块失败,发生了“javax.naming.NameNotFoundException dataSourceName_CMP”异常
访问 EJB 时,发生以下错误:事务 [tran ID] 在 120 秒后超时。
发出消息 BBOT0003W
- 症状:CNTR0001W: 有状态的 SessionBean 不能被钝化
尝试执行 EJB 方法时,症状:org.omg.CORBA.BAD_PARAM: 服务方不是期望的类型。次代码:4942F21E,完成:否返回到客户机程序
如果客户机对于企业 Bean 是远程的,即在不同的应用程序服务器中或作为独立客户机运行,请浏览主管企业 Bean 的应用程序服务器的
JVM 日志以及客户机的日志文件。
如果客户机对于企业 Bean 是远程的,即在不同的应用程序服务器中或作为独立客户机运行,请浏览主管企业 Bean 的应用程序服务器的日志以及客户机的日志文件。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
- 如果问题看似与名称服务相关,即您看到 NameNotFoundException 错误或以 NMSV 开始的消息标识,请参阅这些主题以了解更多信息:
- 使用诊断和修正问题:学习资源中的链接检查是否已标识和记录了该问题。
java.lang.NoSuchMethodError
尝试对会话 Bean 调用方法时,发生 java.lang.NoSuchMethodError。
尝试对 Bean 调用方法 xSLTStory4Session 时,显示了 java.lang.NoSuchMethodError。
CNTR0020E: 对 Bean“BeanId(ERWW_v8#XSLTStory4SessionEJB3.jar#XSLTStory4SessionFacadeBean, null)”
调用方法“xSLTStory4Session”时,EJB 抛出了意外的(未声明的)异常。
异常数据:java.lang.NoSuchMethodError: paysession/ejb3/PaySessionFacadeRemote。
paySession(Ljava/lang/String;)Ljava/lang/String;
在本例中,EAR 文件内的多个模块中存在多个版本的 PaySessionFacadeRemote 接口。其中一个接口未包含期望的方法。
运行时已根据 EAR 文件的类路径中第一个版本的 PaySessionFacadeRemote 接口(这不是正确的版本)生成了存根类。
访问有状态会话 EJB 时,ObjectNotFoundException 或 ObjectNotFoundLocalException
此问题的可能的原因是有状态会话 bean 超时并且由容器移除了。必须按照 EJB 2.1 及更高版本规范,在代码中处理此事件。
在 JVM 日志文件中找到以“EJSContainer E Bean method threw exception [exception_name]”开头的堆栈跟踪
如果异常名称表明 IBM 类抛出了以“com.ibm...”开头的异常,请按描述的方式在信息中心和联机帮助中搜索该异常名称。如果“异常名称”指示由应用程序抛出的异常,请联系应用程序开发者以确定原因。
javax.naming.NameNotFoundException: 在“local”上下文中找不到名称 name
此异常的可能原因是,企业 Bean 对于客户机 JSP、Servlet、Java 应用程序或其他企业 Bean 而言并非本地企业 Bean(不在同一 Java 虚拟机 [JVM] 或应用程序服务器中运行),但是此调用针对企业 Bean 的“本地”接口方法进行。例如,如果此访问在开发环境中工作,但部署到 WebSphere Application Server 后却不工作,那么可能是因为,在开发时,企业 Bean 及其客户机在同一个 JVM 中,但部署后它们在不同的进程中。
要解决此问题,联系企业 Bean 的开发者并确定客户机调用是否是对于企业 Bean 的本地接口中的方法。 如果是,那么将客户机代码更改为调用远程接口方法,或将本地方法提升到远程接口。
对带有本地接口的企业 Bean
的引用在含 URL 方案 local: 的服务器进程的本地名称空间中绑定。要获取服务器 local: 名称空间的转储,请使用“java:、local: 和 server 名称空间的名称空间转储实用程序”一文中描述的名称空间转储实用程序。
抛出 BeanNotReentrantException
发生此问题的原因是客户机代码(通常为 servlet 或 JSP 文件)尝试从两个不同的客户机线程调用同一有状态 SessionBean。当应用程序将对有状态会话 bean 的引用存储到静态变量、使用全局(静态)JSP 变量来引用有状态 SessionBean 引用或者将有状态 SessionBean 引用存储在 HTTP 会话对象中时经常会发生此情况。然后,在完成前一个请求之前,应用程序让客户端浏览器发出对 servlet 或 JSP 文件的新请求。
要解决此问题,要求客户机代码的开发者查看这些条件的代码。
抛出 CSITransactionRolledbackException / TransactionRolledbackException
企业 Bean 容器生成这些高级别异常以表明企业 Bean 调用未完成。当抛出此异常时,浏览 JVM 日志以确定根本原因。
企业 Bean 容器生成这些高级别异常以表明企业 Bean 调用未完成。当抛出此异常时,浏览日志以确定根本原因。
- 企业 Bean 可能抛出不作为其方法特征符的一部分声明的异常。在这种情况下,需要容器来回滚事务。通常发生此情况的原因是企业 Bean 或它调用的代码在哪里产生 NullPointerException、ArrayIndexOutOfBoundsException 或其他 Java 运行时异常,或者,在哪里 BMP bean 遇到 JDBC 错误。解决方法是调查该企业 Bean 代码,并解析底层的异常,或者将异常添加到问题方法特征符。
- 事务可能在处于“Marked Rollback”、“RollingBack”或“RolledBack”状态后尝试执行其他一些工作。事务不能在设置成这些状态中的其中一个状态后继续工作。发生此情况的原因是事务已超时,而事务超时通常是由数据库死锁引起的。使用应用程序数据库管理器工具或者让管理员来确定由企业 Bean 调用的数据库事务是否已超时。
- 由于来自局部事务的悬挂工作,在事务落实时可能会失败。在落实期间,局部事务遇到一些“待定工作”。当局部事务遇到“未解决的操作”时,缺省操作是“回滚”。您可以使用组装工具将此操作调整为“落实”。
尝试启动 EJB 模块失败,发生了“javax.naming.NameNotFoundException dataSourceName_CMP”异常
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
访问企业 Bean 时,事务 [tran ID] 在 120 秒后超时
- 企业 Bean 事务的缺省超时值是 120 秒。过了该时间,事务超时并且连接关闭。
- 如果事务正当地耗用了超出指定超时时间段的时间,请转到 server_name,选择事务服务属性页面,然后查看属性事务生存期超时总计。如果必要,增大此值并保存配置。
![[z/OS]](../images/ngzos.gif)
发出消息 BBOT0003W
- 企业 Bean 事务的缺省超时值是 120 秒。过了该时间,事务超时并且连接关闭。
- 如果事务合法地花费了长于指定超时周期的时间,那么在管理控制台上:
- 转到
- 选择事务服务属性页面
- 增加总计事务生存期超时值
- 保存配置
注: z/OS 将使用您为总计事务生存期超时设置的值作为缺省事务超时设置。如果为此属性设置大于最长事务超时值的值,那么 z/OS 将使用最长事务超时值作为缺省值。
症状:CNTR0001W: 有状态的 SessionBean 不能被钝化
当在 bean 中使用的连接对象未关闭或无效时,会发生此错误。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
[time EDT] <ThreadID> StatefulPassi W CNTR0001W:
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ, <ThreadID>),
state = PASSIVATING) com.ibm.ejs.container.passivator.StatefulPassivator@<ThreadID>
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at java.io.ObjectOutputStream.outputClassFields((Compiled Code))
at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code))
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code))
at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code)
at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd
((Compiled Code))
at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code))
at com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
其中 XXX,YYY,ZZZ 是 Bean 名称,而
<ThreadID> 是用于此次运行的线程标识。![[z/OS]](../images/ngzos.gif)
StatefulPassi W CNTR0001W:
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ),
state = PASSIVATING)
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at java.io.ObjectOutputStream.outputClassFields((Compiled Code))
at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code))
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code))
at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code)
at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd
((Compiled Code))
at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code))
at com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
其中 XXX,YYY,ZZZ 是 Bean 名称。要解决此问题,应用程序必 须关闭所有连接,并设置所有连接的引用为空。通常,此活动通过 Bean 的 ejbPassivate() 方法完成。还要请注意,必须对该 bean 进行编码以在重新激活 bean 时重新获得这些连接。否则,当应用程序尝试复用连接时会有 NullPointerException。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
症状:org.omg.CORBA.BAD_PARAM:Servant 不是所期望的类型。次代码:4942F21E 已完成:否
当程序尝试执行 EJB 方法时,此错误可能会返回到客户机程序中。
此问题通常是由于客户机与服务器安装之间的接口定义和实现不匹配所致。
另一个可能的原因是当设置应用程序服务器以使用单个类装入方案。如果在应用程序服务器保持活动时卸载应用程序,那么已卸载应用程序的类仍装入在应用程序服务器中。如果更改应用程序,并在应用程序服务器上重新部署和重新安装它,那么先前装入的类成为后备级别。后备级别的类导致客户机与服务器之间代码版本不匹配。
- 将应用程序服务器类装入方案更改为多个。
- 停止和重新启动应用程序服务器并再次尝试操作。
- 确保客户机和服务器的代码版本相同。