消息传递引擎故障诊断技巧

使用下面的一组特定技巧来帮助您对服务集成消息传递引擎的问题进行故障诊断。

因为运行时尚未初始化而导致消息传递引擎启动失败

消息传递引擎无法启动,并且在 WebSphere® Application Server 管理控制台中显示以下错误:

The messaging engine <name> cannot be started as there is no runtime 
initialized for it yet, retry the operation once it has been initialized.  
If dynamic configuration reload is enabled for this bus, then the servers 
must be restarted.

再次尝试启动消息传递引擎之前,请确保您已重新启动服务器。 要让运行时成功初始化,必须启动应用程序服务器。

要了解是否因为启动问题而导致消息传递引擎运行时无法初始化,请检查主管服务器的 SystemOut.log 中的错误消息。
注: 本主题引用一个或多个应用程序服务器日志文件。 作为建议的替代方法,您可以将服务器配置为使用高性能可扩展日志记录 (HPEL) 日志和跟踪基础结构,而不是在分布式系统和 IBM® i 系统上使用 SystemOut.logSystemErr.logtrace.logactivity.log 文件。 您还可以将 HPEL 与本机 z/OS® 日志记录工具结合使用。 如果您正在使用 HPEL,那么可以从服务器概要文件 bin 目录使用 LogViewer 命令行工具来访问所有日志和跟踪信息。 有关使用 HPEL 的更多信息,请参阅 有关使用 HPEL 对应用程序进行故障诊断的信息。
[z/OS]

消息传递引擎未使用 DB2 Universal JDBC 类型 2 驱动程序启动

尝试使用 DB2® Universal JDBC 类型 2 驱动程序在 z/OS 平台上存储数据时,消息传递引擎不会启动,Storage Allocation Error类似于以下消息的消息可能会出现在 WebSphere Application Server SystemOut.log 文件中:

BBOO0220E: [SB6NLA1:SB6NLA1.server1-SB6NLA1] CWSIP0002E: An
internal messaging error occurred in com.ibm.ws.sib.processor.im
pl.MessageProcessor, 1:1469:1.365, com.ibm.ws.sib.msgstore.Messa
geStoreRuntimeException: com.ibm.ws.sib.msgstore.PersistenceExce
ption: CWSIS1501E: The data source has produced an unexpected
exception: com.ibm.db2.jcc.t2zos.y: [IBM/DB2][T2zos/2.5.48]T2zo
sPreparedStatement.readPrepareDescribeOutput_:processDescribeOut
put:1563:Storage 分配错误 com.ibm.ws.sib.msgstore.cac
he.links.AbstractItemLink.readDataFromPersistence(AbstractItemLi
nk.java:2487 在
com.ibm.ws.sib.msgstore.cache.links.AbstractItemLink._restoreIte
m( AbstractItemLink.java:639 )
对于 z/OS 平台,应使用 DB2 Universal JDBC 类型 4 驱动程序。 如果必须使用 DB2 Universal JDBC 类型 2 驱动程序,请完成以下步骤:
  1. 使用管理控制台浏览至 资源 -> JDBC -> 数据源 -> data_source_name -> [其他属性] 定制属性
  2. 将 JDBC 驱动程序定制属性 fullyMaterializeLobData 设置为 false

    fullyMaterializeLobData 定制属性用于确定某行已访存时是在 JDBC 驱动程序中完全具体化 LOB 数据,还是根据需要分块对 LOB 数据进行检索。 实际行为取决于数据库服务器是否支持顺序流式方法。 请参阅 DB2 文档以了解有关此属性的更多信息。 缺省值为 true。

  3. 将更改保存至主配置。
  4. 重新启动应用程序服务器。

由于 Informix JDBC Driver 3.00JC1 中的已知错误,消息传递引擎无法启动

尝试使用 Informix® JDBC 驱动程序 3.00JC1 来存储数据时,消息传递引擎无法启动,并且 WebSphere Application Server SystemOut.log 文件中可能出现以下错误消息:

00000022 SibMessage E [RetireBus:retire_web.000- RetireBus] CWSIS0002E: 
消息传递引擎在启动时遇到异常。 
异常:com.ibm.ws.sib.msgstore.PersistenceException: CWSIS1501E: 
数据源产生了意外异常:java.sql.BatchUpdateException:
违反了唯一性约束 (informix.u114_62)。
00000022 SibMessage E [RetireBus:retire_web.000- RetireBus] CWSID0035E: 
消息传递引擎 retire_web.000-RetireBus 无法启动;
在 com.ibm.ws.sib.msgstore.impl.MessageStoreImpl start() 期间报告了检测到的错误 
00000022 SibMessage E [RetireBus:retire_web.000- RetireBus] CWSID0027I: 
无法重新启动消息传递引擎 retire_web.000-RetireBus ,因为 
严重错误为 reported.T] 
00000022 SibMessage I [RetireBus:retire_web.000- RetireBus] CWSID0016I: 
消息传递引擎 retire_web.000-RetireBus 处于“已停止”状态。  

Informix JDBC Driver 3.00JC1中存在已知缺陷 (PTS 172471)。 要避免此错误,请将 Informix JDBC Driver 升级到 3.00JC2。

数据存储器的问题确定

您可对消息传递引擎的数据存储器中的数据创建转储(以简化形式)。 该输出旨在供 IBM 服务人员使用。 请与支持组织联系以获取有关如何运行该命令的信息。
如果数据存储器中的数据存在问题,那么很难从跟踪输出进行诊断。 但是,您可创建数据存储器中的数据转储(以 XML 格式)。 这就使诊断更容易,因为它是可读表示法,它可根据需要变换为其他格式。 可以通过在 wsadmin 工具中输入以下命令来创建数据存储器转储:
  • 使用 Jython:
    AdminControl.invoke(AdminControl.queryNames("type=SIBMessagingEngine,
     name=messagingenginename,*"),
     "dump", "com.ibm.ws.sib.msgstore.*")
  • 使用 Jacl:
    $AdminControl invoke [$AdminControl queryNames type=SIBMessagingEngine,
     name=messagingenginename,*] 
     dump com.ibm.ws.sib.msgstore.*

在 $WAS_HOME/logs/server1 目录中作为 XML 文件来创建转储。 该文件根据以下格式进行命名: messaging_engine_nameUUIDtimestamp.xml

下列示例举例说明该文件的格式:
<MessageStore>
    <itemStreams>
        <ItemStreamLink id="0" state="Available">
            <class>com.ibm.ws.sib.msgstore.ItemStream</class>
            <priority>5</priority>
            <canExpireSilently></canExpireSilently>
            <storageStrategy>STORE_NEVER</storageStrategy>
            <expiryTime>0</expiryTime>
            <sequence>0</sequence>
            <tranID>null</tranID>
            <tickValue>0</tickValue>
            <items>
                <ItemLink id="2" state="Available" refCount="3" refCountDecreasing="false">
                    <class>com.ibm.ws.sib.msgstore.Item</class>
                    <priority>5</priority>
                    <canExpireSilently></canExpireSilently>
                    <storageStrategy>STORE_NEVER</storageStrategy>
                    <expiryTime>0</expiryTime>
                    <sequence>1</sequence>
                    <tranID>null</tranID>
                    <tickValue>0</tickValue>
                </ItemLink></items></ItemStreamLink></itemStreams></MessageStore>

消息传递引擎导致数据库争用消息

消息传递引擎将数据存储器用于消息存储器时,如果同一消息传递引擎意外启动两次,那么会显示数据库争用消息:
CWSIS1546I: 消息传递引擎 ME_UUID={0} INC_UUID={1} 丢失了 
现有锁定或无法获得数据存储器上的初始锁定。
要解决此问题:
  • 检查数据库问题,例如,数据库不可用。
  • 检查网络问题。 例如,如果网络超负荷,那么两个应用程序服务器可能能够连接至数据库,但可能无法相互连接,这可能导致资源协调问题。
  • 如果具有提供高可用性或工作负载分摊的服务集成配置,请检查是否正确配置了适当的资源。 例如,检查消息传递引擎、这些消息传递引擎的核心组策略以及将每个核心组策略与消息传递引擎相关联的匹配条件。

XAResourceNotAvailableException 异常的可能原因以及如何执行适当的操作

deleteNode 命令用于主管消息传递引擎的节点时,会删除那些消息传递引擎。 使用 addNode 命令重新创建新的消息传递引擎时,它们拥有不同的标识,因此,在事务恢复期间,不可能连接至旧的消息传递引擎。 对主管消息传递引擎的每个服务器都会在 SystemOut.log 文件中生成一个标识 XAResourceNotAvailableException 异常的消息。

要解决此问题,必须遵循 解决不确定事务中描述的过程。

集群总线成员中的服务器进行故障转移时也会抛出 XAResourceNotAvailableException 异常。 在该情况下,不需要操作员干预就可恢复并解析事务。

重新创建服务集成总线时发生的问题

如果您删除服务集成总线并在稍后创建同名的新总线,那么消息传递引擎不会启动并且会在 SystemOut.log 中生成如下消息:
[8/11/04 21:55:01:439 CDT] 0000000f SibMessage    I   
[LateBus:xyzsun15.server1-LateBus] isAlive: MessagingEngine 遇到常见错误。 
更正错误(请参阅日志)并重新启动服务器。
[8/11/04 21:55:01:468 CDT] 0000000f SibMessage    I   
[LateBus:xyzsun15.server1-LateBus] isAlive: 将停止 MessagingEngine, 
因为发生了常见错误。 
将不发生故障转移。
[8/11/04 21:55:01:493 CDT] 0000000f SibMessage    I   
[LateBus:xyzsun15.server1-LateBus] 消息传递引擎 
xyzsun15.server1-LateBus 未处于有效的停止状态:正在启动
[8/11/04 21:55:01:513 CDT] 0000000f SibMessage    I   
[LateBus:xyzsun15.server1-LateBus] isAlive: MessagingEngine 已停止,因为 
发生了常见错误。 更正错误(请参阅日志)并重新启动服务器。
[8/11/04 21:57:01:431 CDT] 0000000e SibMessage    I   
[ LateBus:xyzsun15.server1-LateBus ] isAlive: MessagingEngine suffered 
公共方式错误。 
更正错误(请参阅日志)并重新启动服务器。

删除总线后,由于消息传递引擎的数据库目录仍存在,因此消息传递引擎无法启动。您必须手动移除该目录。 要删除不存在的消息传递引擎的 Apache Derby 数据库,必须删除位于 profile_root/databases/com.ibm.ws.sib中的数据库目录,其中 profile_root 是存储特定于概要文件的信息的目录。

必须先停止 WebSphere Application Server ,然后才能删除数据库文件。

对于其他数据库,可以删除数据存储器表中的所有行,也可以删除所有数据存储器表。 这些表在您为数据存储器配置的模式中。 有关表的列表,请参阅数据存储表

有关更多信息,请参阅 数据存储生命周期

外部总线通信问题

为了在总线之间进行通信,必须创建外部总线和服务总线集成链路。 在第一条总线上,外部总线名必须与成为外部总线的第二条总线的名称匹配,第二条总线的外部总线名必须与第一条总线的名称匹配。 这两条总线上的服务集成总线链路名必须相同。

如果配置不正确(例如服务集成总线链路不匹配),那么您可能会遇到以下类型的错误:

SibMessage    E   [TechBus:TechCluster.000-TechBus] 
CWSIT0057E: 在主机 aixp401.rchland.ibm.com 上的远程消息传递引擎中, 
总线间连接 BookstoreBus 失败,原因: 
CWSIT0067E: 总线 BookstoreBus 中的总线间连接 BookstoreBus 
不可用。

在尝试与已重命名的外部总线通信时产生的问题

用于配置服务集成总线链路的属性的管理控制台面板也可用于更改链路指向的外部总线名称。 但是,配置外部总线后,您不能变更它的名称。 如果更改该名称,那么直到外部总线名称重设为其先前的值时,已保存有关该链路的状态信息的所有消息传递引擎才能使用该链路。

包含 SILimitExceeded 异常的 JMSException 的可能原因

当一个目标中存放的消息数达到它的限制阈值时,尝试将消息发送至该目标时都将失败,并产生包含 SILimitExceeded 异常的 JMSException。 目标由于此异常而继续失败,直到目标保留的消息数减少到小于限制阈值为止。

要获得可用消息数的准确计数,可以监视队列和主题空间目标的“可用消息计数 PMI”统计信息。 如果可用消息数增加,那么应执行操作来平衡系统。 应考虑让生产者停止发送新消息,直到目标使用可用消息为止。

检查以下列表以了解此问题的可能原因和解决方案:
  • 相对于预计的消息数,目标的阈值上限太低了。 目标不会处理某些消息。 阈值上限的缺省值为 50000。
    解决方案: 提高目标的阈值上限。
  • 应用程序生成的消息数超过了目标可以处理的消息数。

    理想的平衡状态是在一段时间内产生的消息数与使用的消息数相等。 如果系统处于不平衡状态,而是生产应用程序发送的消息数多于目标可以使用的消息数,那么生产应用程序最终会抛出 JMSException。

    解决方案: 在生成的消息数与使用的消息数之间求平衡。
    提示: 对象请求代理 (ORB) 线程池的缺省设置为 100 个线程。 对于某些应用程序,可能会允许 100 个应用程序将消息发送至同一个目标。 考虑将 ORB 线程池调整为最多具有 10 个线程。 此设置可减少可发送消息的生产者的数量,这可能会增加整体消息吞吐量。
  • 应用程序正在处理来自目标的消息,但是速度很慢。
    解决方案: 可能需要增加客户机应用程序使用的消息数。 当从该目标中读取多个使用者时,目标将处理更多消息。

    考虑在非集群环境中的多个服务器之间克隆应用程序。 缺省情况下,是在集群服务器环境中克隆应用程序的。 要在非集群环境中启用订户,在 DurableSubscriptions 的 TopicConnectionFactory JNDI 设置中设置 cloned 标志。

    限制: 此解决方案不适用于需要总消息排序的应用程序。
  • 消息的服务质量属性优于最大努力非持久。
    解决方案: 使用服务质量属性为最大努力非持久的消息。 如果系统中有过多消息,那么目标将废弃最大努力非持久消息。
    限制: 此解决方案不适用于必须接收所有消息的应用程序。

系统重新启动时的损坏问题

重新启动系统之后,消息传递引擎、目标或链路可能会损坏,尽管很少发生这种情况。 如果发生这种损坏,那么您将看到一条消息指出发生的问题。 如果问题与消息传递引擎有关,那么消息传递引擎将无法启动。 如果目标或链路被毁坏,那么相关消息传递引擎将启动,但是该目标或链路在该消息传递引擎上将不可用。

如果您不知道问题的原因,请与 IBM 服务代表联系,以在尝试解决此问题之前确定原因。

如果您知道问题的原因,例如,您知道数据库存在问题,那么通过完成以下步骤来解决该问题:
  1. 在整个系统中同步配置文件。

    使用管理控制台来同步配置文件。 单击 系统管理 -> 节点 ,然后单击 完全再同步。 运行此操作可能要花几分钟。

  2. 如果问题仍然存在,请执行下列其中一项任务:
    • 删除损坏的对象然后再重新进行创建。 在发生损坏前生成或接收到的消息将丢失。
    • 从备份复原系统。 自从执行备份以来生成或接收到的消息将丢失。

在管理控制台中检索消息传递引擎的状态

要能够检索消息传递引擎的状态,您必须至少使用监视权限登录到管理控制台。 如果您没有此权限,那么消息传递引擎状态将显示为 不可用,即使消息传递引擎已启动也是如此。

如果您没有使用检索消息传递引擎的状态所需要的权限来登录,那么会将类似以下内容的错误消息记录到服务器的 systemOut 日志文件中:
[4/20/05 10:49:57:083 CDT] 0000004b RoleBasedAuth a   
SECJ0305I: 针对 admin-authz 的基于角色的授权检查失败 
操作 SIBMessagingEngine:stateExtended。 
未向用户 UNAUTHENTICATED (唯一标识: unauthenticated) 授予任何
 以下必需角色 :administrator , operator , configurator 和 monitor。
显示在消息中的用户标识就是您用来登录至管理控制台的用户标识。

使应用程序可以在必需的消息传递引擎启动前启动

如果应用程序依赖于可用的消息传递引擎,那么必须先启动消息传递引擎,然后再运行该应用程序。 如果要让应用程序服务器自动启动应用程序,那么应该将应用程序开发成测试任何必需的消息传递引擎是否已启动,并根据需要等待消息传递引擎启动。 如果在启动 Bean 中使用此技术,那么启动 Bean 方法应该在独立的线程中使用标准 WorkManager 方法来执行测试和等待工作,以便应用程序服务器的启动不会被延迟。

有关用于测试和等待消息传递引擎的代码示例,请参阅 依赖于消息传递引擎可用性的应用程序

[z/OS]

服务器启动期间出现的通道框架消息

启动服务器时,您可能会看到控制区域助手 (CRA) 进程中显示的通道框架参考消息。 这些消息并不表示发生了任何错误,并且不需要您执行任何操作。
  • 发出以下消息的原因是,启动消息传递引擎前包含消息驱动的 bean 的应用程序已启动。
    CWSIV0759W: 在激活消息驱动的 bean 期间,没有合适的 
    在总线 {0}上的本地服务器中找到活动的消息传递引擎。

    当消息传递引擎启动时,另一条参考消息将确认这种情况,接着就可以进行消息处理。

  • 由于 z/OS TCP 代理通道以异步方式启动,因此发出了以下消息。
    CHFW0030E: 由于发生异常 {1},因此启动链 {0} 时出错

    当消息传递引擎启动时,另一条参考消息将确认这种情况,接着就可以进行消息处理。

    这些消息仅在特定情况下显示,例如,如果您在迁移期间更改了端口,那么可能会显示这些消息。

  • 在服务器启动期间,控制区域助手进程中可能会多次显示以下消息,即使随后进行重试时连接成功也是如此。 发出此消息的原因是 z/OS TCP 代理通道以异步方式启动,并且未指示发生任何错误。
    跟踪时间:2009/06/17 08:24:41.434 01 t=9C6B58 c=UNK key=P8 (00000011)
    描述:记录 Java 消息 
    消息:CHFW0030E: 启动链 _InboundTCPProxyBridgeService 时出错, 
    因为发生了异常 
    com.ibm.wsspi.channel.framework.exception.RetryableChannelException: 
    尝试启动 TCPProxyChannel 时抛出了异常 
    com.ibm.ws.channel.framework.imp l.ChannelFrameworkImpl
    
    发出这些消息的同时,可能会显示首次故障数据捕获 (FFDC) 输入,其内容类似于以下示例:
    异常 = com.ibm.wsspi.channel.framework.exception.RetryableChannelException
    源 = com.ibm.ws.channel.framework.impl.ChannelFrameworkImpl.startChainInternal
    probeid = 2577
    堆栈转储 = com.ibm.wsspi.channel.framework.exception.RetryableChannelException: 
    尝试启动 TCPProxyChannel 时抛出了异常
    		at com.ibm.ws.tcpchannelproxy.jfap.impl.TCPProxyInboundChannel.start(TCPProxyInboundChannel.java:153)
    		at com.ibm.ws.channel.framework.impl.ChannelFrameworkImpl.startChannelInChain(ChannelFrameworkImpl.java:1410)
    		at com.ibm.ws.channel.framework.impl.ChannelFrameworkImpl.startChainInternal(ChannelFrameworkImpl.java:2863)
     		at com.ibm.ws.channel.framework.impl.WSChannelFrameworkImpl.startChainInternal(WSChannelFrameworkImpl.java:960)
    		at com.ibm.ws.channel.framework.impl.ChannelFrameworkImpl.startChainInternal(ChannelFrameworkImpl.java:2794)
     		at com.ibm.ws.channel.framework.impl.ChannelFrameworkImpl.startChain(ChannelFrameworkImpl.java:2779)
     		at com.ibm.ws.runtime.component.ChannelFrameworkServiceImpl.startChain(ChannelFrameworkServiceImpl.java:666)
     		at com.ibm.ws.sib.jfapchannel.framework.impl.ChannelFrameworkReference$TCPProxyBridgeServiceInboundChainStartupRunnable
    			.run(ChannelFrameworkReference.java:1641)
    		at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1550)
    原因:com.ibm.ws.tcpchannelproxy.jfap.NotYetInitializedException:服务器尚未初始化
    		at com.ibm.ws.tcpchannelproxy.jfap.TCPProxyBridgeServicesImpl.startListening(TCPProxyBridgeServicesImpl.java:558)
    		at com.ibm.ws.tcpchannelproxy.jfap.impl.TCPProxyInboundChannel.start(TCPProxyInboundChannel.java:131)
    		... 还有 8 个
    最终应显示以下消息,指示 z/OS TCP 代理通道已正确启动:
    跟踪时间:2009/06/17 08:24:51.449 01 t=9C6B58 c=UNK key=P8 (13007002)
       ThreadId: 00000003
       FunctionName: com.ibm.ws.channel.framework.impl.WSChannelFrameworkImpl
       SourceId: com.ibm.ws.channel.framework.impl.WSChannelFrameworkImpl
       Category: AUDIT
       ExtendedMessage: BBOO0222I: CHFW0019I: 传输通道服务已启动 
    链 _InboundTCPProxyBridgeService。

包含 V 6 服务器的混合版本集群不支持消息传递引擎故障转移

WebSphere Application Server Version 7.0 或更高版本 服务器上托管的消息传递引擎无法故障转移到在 WebSphere Application Server Version 6 服务器上托管的消息传递引擎。 如果您具有由 V 6 和更高版本的服务器混合组成的集群总线成员,那么必须确保配置高可用性策略以防止此类型的故障转移。

为防止 V 7.0 或更高版本 消息传递引擎故障转移到 V 6 服务器,请 配置消息传递引擎的高可用性策略 ,以便将集群有效地分为一组用于 V 6 的服务器,另一组用于 V 7.0 或更高版本的服务器, 并且 V 7.0 或更高版本 消息传递引擎仅限于 V 7.0 或更高版本的服务器。