落实方式是指 IMS™ 执行的落实处理的类型。Java™ 客户机指定它在将事务请求提交给 IMS 时要使用的落实方式协议。IMS Connect 和 IMS 支持以下两种类型的落实方式处理:落实方式 0(先落实后发送),在这种方式下,IMS 将先落实 IMS 数据库更改,然后将输出发送至客户机;落实方式 1(先发送后落实),在这种方式下,IMS 先将输出发送至客户机,然后再落实数据库更改。
与落实方式协议相关联的是,IMS Connect 和 IMS 还支持以下三个同步级别(同步级别):NONE、CONFIRM 和 SYNCPT。所有这三个同步级别都可用于落实方式 1。而只有 CONFIRM 同步级别可用于落实方式 0。但是,IMS Connector for Java 目前还不支持对落实方式 1 使用 CONFIRM 同步级别。
目前,同步级别不是由 Java 客户机设置的。当与 IMS Connect 通信时,IMS Connector for Java 会自动提供同步级别。
这种组合用于非事务性交互。对于非对话式应用程序,使用 SYNC_SEND_RECEIVE 交互。对于对话式应用程序,则使用 SYNC_SEND_RECEIVE 交互,也可以选择使用 SYNC_END_CONVERSATION 交互。
当参与对 IMS 的两阶段落实处理时,IMS Connector for Java 就会使用这种组合。有关更多信息,请参阅全局事务支持与两阶段落实。
对于非事务性 SYNC_SEND_RECEIVE、SYNC_SEND、SYNC_RECEIVE_ASYNCOUTPUT、SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_NOWAIT 和 SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_WAIT 交互,IMS Connector for Java 就会使用这种组合。
注意:只有在 TCP/IP 连接上运行的非对话式应用程序才支持落实方式 0。
同步级别不是由 Java 客户机设置的。当与 IMS Connect 通信时,IMS Connector for Java 会自动提供同步级别。
如果 Java 客户机采用落实方式 1 同步级别 NONE 来提交事务请求,则 IMS Connector for Java 将通过 IMS Connect 把请求传递给 IMS。IMS 就会处理此事务并尝试将输出消息发送至 Java 客户机。Java 客户机可能会接收到该事务产生的输出消息,也可能会接收到异常。在任何一种情况下,IMS 都已落实对数据库所作的更改并且已废弃 IMS 事务的输出消息。
类似地,如果 Java 客户机采用落实方式 0 同步级别 CONFIRM 来发送事务,则 Java 客户机可能会接收到该事务产生的输出消息,也可能会接收到异常。但是,如果使用落实方式 0 时 Java 客户机接收到异常,则可能会也可能不会对输出进行排队以供将来检索。是否对未传递给 Java 客户机的输出消息进行排队,这取决于 Java 客户机用于落实方式 0 交互的套接字连接类型。
异常的类型也将确定输出消息是否可供检索。例如,如果 Java 客户机接收到 IMSDFSMessageException,它表示事务已停止,应用程序未运行;因此,没有输出消息可供检索。然而,如果事务在运行,但是在将输出消息返回至 IMS Connect 之前 executionTimeout 值已到期,则 Java 客户机将接收到 EISSystemException,它表示执行已超时。在这种情况下,就会将输出消息排队至适当的“IMS OTMA 异步输出队列”或 TPIPE 以供将来检索。
注意:在 IMS/OTMA 术语中,事务管道(TPIPE)就是指客户机(IMS Connect)与服务器(IMS/OTMA)之间的逻辑连接。对于落实方式 0 交互,由用于交互的 clientID 来标识 TPIPE。用于落实方式 0 事务的每个 clientID 都具有它自己的 TPIPE。对于落实方式 1 交互,由用于交互的 IMS Connect 端口号来标识 TPIPE。因此,每个端口都将有一个 TPIPE,该 TPIPE 将用于在该端口上运行落实方式 1 交互的所有客户机。
无论 Java 客户机正在采用落实方式 1 还是落实方式 0 来运行 IMS 事务,Java 客户机都会为 IMSInteractionSpec 的 interactionVerb 属性指定一个值。如果指定了落实方式 0 交互,Java 客户机可能还必须提供 IMSConnectionSpec 的 clientID 属性的值。clientID 是 IMSConnectionSpec 的一种属性,它标识可恢复的输出消息所在的“IMS OTMA 异步输出队列”或 TPIPE。Java 客户机是否为落实方式 0 交互提供 clientID 取决于 Java 客户机所使用的套接字连接类型。
要检索来自 TPIPE 的输出消息,Java 客户机应提交一个请求,在该请求中,Java 客户机将为 IMSInteractionSpec 的 interactionVerb 属性指定 SYNC_RECEIVE_ASYNCOUTPUT、SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_NOWAIT 或 SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_WAIT 这三个值中的任何一个值,还要为 IMSConnectionSpec 的 clientID 属性指定一个值。有关异步输出支持的更多信息,请参阅 IMS Connect Guide and Reference 中的 Chapter 9: Protocols。
总之,SYNC_RECEIVE_ASYNCOUTPUT、SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_NOWAIT 或 SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_WAIT 交互都可以用来检索任何 clientID 排队的输出消息,而不管是如何将这些输出消息排队至相关联的 clientID 的 - 因失败的落实方式 0 事务造成排队,或是因为对 ALTPCB(备用程序通信块)执行插入操作的 IMS 应用程序造成排队。当检索来自失败的落实方式 0 事务的输出消息时,在 IMSConnectionSpec 中为检索请求提供的 clientID 必须与在失败的落实方式 0 事务上指定的 clientID 相匹配。
如果在该特定 clientID 的“OTMA 异步输出队列”中不存在任何内容,您就会接收到执行超时异常。下面两种情况都会造成超时异常:队列中没有任何消息;超时值没有提供足够的时间让 IMS Connect 从队列中检索消息。对于 SYNC_RECEIVE_ASYNCOUTPUT、SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_NOWAIT 或 SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_WAIT 以及 SYNC_SEND_RECEIVE 交互,executionTimeout 是 IMS Connect 等待来自 IMS 的响应将花费的时间。如果不为检索请求指定执行超时值,则使用缺省的执行超时值。缺省超时值就是 IMS Connect 配置成员 TIMEOUT 值。用户可能需要尝试使用不同的执行超时值,以确保返回所有交互类型的输出消息。
IMS 资源适配器创建的所有套接字连接都是持久的。换句话说,IMS Connector for Java 与 IMS Connect 之间的同一个套接字连接可连续复用于与 IMS Connect 的多次交互。在这些交互之间,不会关闭之后再重新打开该套接字连接。持久套接字有两种类型:可共享持久套接字和专用持久套接字。
可共享持久套接字可供执行落实方式 1 或落实方式 0 交互的多个应用程序共享(连续复用)。对于在可共享持久套接字上执行落实方式 0 交互的应用程序,IMS 资源适配器将自动生成前缀为“HWS”的 clientID。此 clientID 表示并标识套接字连接以及相关联的 OTMA TPIPE。这种类型的套接字只允许使用由 IMS 资源适配器生成的 clientID。不允许将用户指定的 clientID 用于可共享持久套接字支持。
注意:将消息插入备用 PCB 的 IMS 应用程序一定不要对备用 PCB 使用以“HWS”开头的名称。
对于不能传递至在可共享持久套接字上执行落实方式 0 交互的 Java 客户机的输出消息,可以将它们排队以供将来检索。另外,可共享持久套接字上的任何落实方式 1 或落实方式 0 交互引起程序间切换,而程序间切换将调用产生辅助输出的另一个落实方式 0 交互,这样可以将这些输出重新排队以供将来检索。SYNC_RECEIVE_ASYNCOUTPUT、SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_NOWAIT 和 SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_WAIT 交互在可共享持久套接字上都是受支持的。要检索在“IMS OTMA 异步挂起队列”或 TPIPE 中排队的未传递的输出消息,必须在同一个客户机应用程序中调用 interactionVerb,这是因为必须使用已生成的同一个 clientID,该 clientID 用来标识可共享的套接字连接和相关联的 OTMA TPIPE。
在可共享持久套接字上,可以采用多种方法来处理未传递的输出消息。一种方法是清除未传递的输出。要清除未传递的输出消息,必须确保 IMSInteractionSpec 属性 purgeAsyncOutput 为 TRUE。此输入属性确定 IMS Connect 是否清除未传递的 I/O PCB 输出。purgeAsyncOutput 属性仅对于 SYNC_SEND_RECEIVE interactionVerb 有效。如果在 SYNC_SEND_RECEIVE 上未指定该属性,则缺省值为 TRUE。
用来处理可共享持久套接字上的未传递输出消息的另一个选项是将消息重新路由至另一个目标。通过将 IMSInteractionSpec 属性 reRoute 设置为 TRUE,就可以将未传递的输出消息重新路由至另一个目标。此属性仅对于 SYNC_SEND_RECEIVE interactionVerb 有效。如果 reRoute 设置为 TRUE,则会将未传递的输出消息排队至由客户机应用程序提供的指定目标,该目标是在 IMSInteractionSpec 属性 reRouteName 上指定的。如果 reRoute 属性设置为 TRUE,但是没有提供 reRouteName,则 reRouteName 属性的值就是在 IMS Connect 配置文件中指定的值。如果在 IMS Connect 配置文件中没有指定值,则使用缺省值 HWS$DEF。
所谓专用持久套接字,就是将套接字连接指定给特定 clientID,并且一直让该 clientID 专用,直到该套接字连接断开为止。SYNC_SEND_RECEIVE、SYNC_SEND、SYNC_RECEIVE_ASYNCOUTPUT、SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_NOWAIT 和 SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_WAIT 交互在专用持久套接字上都是受支持的。
专用持久套接字上的 SYNC_RECEIVE_ASYNCOUTPUT、SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_NOWAIT 和 SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_WAIT 交互使客户机应用程序能够检索存在于“IMS OTMA 异步输出队列”中的下列消息:1)失败的落实方式 0 交互产生的消息;2)对 ALTPCB(备用程序通信块)执行插入操作的 IMS 应用程序所产生的消息;3)对在可共享连接工厂上执行的事务的输出进行重新路由所产生的消息。要检索这些消息,客户机应用程序必须提供 clientID,clientID 表示具有排队的异步输出消息的 TPIPE。不能重新路由或清除专用持久套接字上有未传递的输出消息的交互。
如果 endCM0Dedicated 属性的值为 TRUE,则可确保连接工厂将创建专用持久套接字连接。
javax.resource.spi.EISSystemException:ICO0001E: com.ibm.connector2.ims.ico.IMSTCPIPManagedConnection@23766050.processOutputOTMAMsg(byte [], InteractionSpec,Record) 错误。IMS Connect 返回的错误:RETCODE=[8], REASONCODE=[DUPECLNT]。 使用了重复的客户机标识;当前正在使用该客户机标识。
IMS Connector for Java 与 IMS Connect 之间的 TCP/IP 连接是持久的;换句话说,只要 IMS Connector for Java 或 IMS Connect 不因发生错误而断开该连接,它就会一直保持连接状态。对于可共享持久套接字连接和专用持久套接字连接都是如此。但是,对于专用持久套接字连接,只有其 clientID 与用来建立连接的 clientID 相同的那些交互才能使用该套接字连接。当将新的 clientID 用于专用持久套接字连接上的交互时,套接字连接数就会增加。
如果将“最大连接数”属性设置为一个非零值,并且将“连接超时”属性也设置为一个非零值,则当达到“最大连接数”并且正在使用所有连接时,在经过“连接超时”中指定的秒数之后,应用程序就会产生 ConnectionWaitTimeoutException。这是 WebSphere® Application Server 的标准行为。ConnectionWaitTimeoutException 同时适用于专用持久套接字和可共享持久套接字。
但是,如果已经达到了“最大连接数”,但是目前未使用其中一个持久套接字连接,则 WebSphere Application Server 就会断开该套接字,以便响应创建新的持久套接字连接的请求。这也是 WebSphere Application Server 的标准行为,并且也同时适用于专用持久套接字和可共享持久套接字。