落实方式是指 IMS 执行的落实处理的类型。Java™ 客户机指定它在将事务请求提交给 IMS 时要使用的落实方式协议。IMS Connect 和 IMS 支持以下两种类型的落实方式处理:落实方式 0(先落实后发送),在这种方式下,IMS 将先落实 IMS 数据库更改,然后将输出发送至客户机;落实方式 1(先发送后落实),在这种方式下,IMS 先将输出发送至客户机,然后再落实数据库更改。
与落实方式协议相关联的是,IMS Connect 和 IMS 还支持以下三个同步级别(同步级别):NONE、CONFIRM 和 SYNCPT。所有这三个同步级别都可用于落实方式 1。而只有 CONFIRM 同步级别可用于落实方式 0。
虽然与 IMS Connect 通信时 IMS Connector for Java 会自动提供同步级别,但可通过 Java 使用 setSyncLevel(int) 方法将同步级别显式设置为 NONE 或 CONFIRM。当前 Java 客户机不能将同步级别显式设置为 SYNCPT。对于落实方式 1 交互,缺省同步级别为 NONE。仅将交互动词设置为 SYNC_SEND_RECEIVE 而不设置同步级别已经足够了。对于落实方式 0 交互,缺省同步级别为 CONFIRM。仅将交互动词设置为 SYNC_SEND_RECEIVE 并将落实方式设置为 0 而不设置同步级别已经足够了。如果向 setSyncLevel(int) 方法传递 0 或 1 之外的任何其他数值,则将抛出错误。
这种组合用于非事务性交互。对于非对话式应用程序,使用 SYNC_SEND_RECEIVE 交互。对于对话式应用程序,则使用 SYNC_SEND_RECEIVE 交互,也可以选择使用 SYNC_END_CONVERSATION 交互。
这种组合用于非事务性交互。对于非对话式应用程序,使用 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 客户机采用落实方式 1 同步级别 CONFIRM 来提交事务请求,则 IMS Connector for Java 会通过 IMS Connect 将请求传递给 IMS。IMS 会处理此事务并尝试通过 IMS Connector for Java 将输出消息发送至 Java 客户机。IMS Connector for Java 会代表 Java 客户机将肯定确认发送至 IMS。IMS 会将返回码发送至 IMS Connector for Java 以指示更改是否落实。如果已落实,则 IMS Connector for Java 会将输出发送至 Java 客户机。如果未落实,则 Java 客户机将接收到异常。如果此过程期间发生任何错误,则 Java 客户机将接收到异常。
异常的类型也将确定输出消息是否可供检索。例如,如果 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 TM 资源适配器创建的所有套接字连接都是持久的。换句话说,IMS Connector for Java 与 IMS Connect 之间的同一个套接字连接可在与 IMS Connect 的多次交互中连续复用。在这些交互之间,不会关闭之后再重新打开该套接字连接。持久套接字有两种类型:可共享持久套接字和专用持久套接字。
可共享持久套接字可供执行落实方式 1 或落实方式 0 交互的多个应用程序共享(连续复用)。对于在可共享持久套接字上执行落实方式 0 交互的应用程序,IMS 资源适配器将自动生成前缀为“HWS”的 clientID。此 clientID 表示并标识套接字连接以及相关联的 OTMA TPIPE。这种类型的套接字只允许使用由 IMS TM 资源适配器生成的 clientID。不允许将用户指定的 clientID 用于可共享持久套接字支持。
对于不能传递至在可共享持久套接字上执行落实方式 0 交互的 Java 客户机的输出消息,可以将它们排队以供将来检索。另外,可共享持久套接字上的任何落实方式 1 或落实方式 0 交互引起程序间切换,而程序间切换将调用产生辅助输出的另一个落实方式 0 交互,这样可以将这些输出重新排队以供将来检索。SYNC_RECEIVE_ASYNCOUTPUT、SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_NOWAIT 和 SYNC_RECEIVE_ASYNCOUTPUT_SINGLE_WAIT 交互在可共享持久套接字上都是受支持的。如果未使用备用 clientID,则要检索在“IMS OTMA 异步挂起队列”或 TPIPE 中排队的未传递的输出消息,必须在同一个客户机应用程序中调用交互动词,因为必须使用那个标识可共享套接字连接和相关联的 OTMA TPIPE 的已生成 clientID。
在可共享持久套接字上,可以采用多种方法来处理未传递的输出消息。可以通过指定将异步输出消息作为 IMSInteractionSpec 对象的备用 clientID 属性值的 OTMA 挂起队列名称来检索未传递的输出。或者,可清除未传递的输出。要清除未传递的输出消息,必须确保 IMSInteractionSpec 属性 purgeAsyncOutput 为 TRUE。此输入属性确定 IMS Connect 是否清除未传递的 I/O PCB 输出。purgeAsyncOutput 属性仅对于 SYNC_SEND_RECEIVE 交互动词有效。如果在 SYNC_SEND_RECEIVE 上未指定该属性,则缺省值为 TRUE。
通过将 IMSInteractionSpec 属性 reRoute 设置为 TRUE,就可以将未传递的输出消息重新路由至另一个目标。此属性仅对于 SYNC_SEND_RECEIVE 交互动词有效。如果 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。不能重新路由或清除专用持久套接字上有未传递的输出消息的交互。
如果 CM0Dedicated 属性的值为 TRUE,则可确保连接工厂将创建专用持久套接字连接。
javax.resource.spi.EISSystemException: ICO0001E: com.ibm.connector2.ims.ico.IMSTCPIPManagedConnection@23766050.processOutputOTMAMsg (byte [], InteractionSpec,Record) error. IMS Connect returned error: RETCODE=[8], REASONCODE=[DUPECLNT]. Duplicate client ID was used; the client ID is currently in use.
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 的标准行为,并且同时适用于专用持久套接字和可共享持久套接字。