要在 IMS™ 中运行事务,Java™ 应用程序将执行 SYNC_SEND_RECEIVE 交互。应用程序为 interactionVerb 属性提供的值为 SYNC_SEND_RECEIVE,为 execute 方法所使用的 IMSInteractionSpec 对象的 commitMode 属性指定的值为 0 或 1。但是,对于可共享持久套接字和专用持久套接字,SYNC_SEND_RECEIVE 交互处理是不同的。
IMS 资源适配器与应用程序服务器一起从连接池中获得可用连接,或者创建新的连接。作为对新连接进行初始化的一部分,IMS 资源适配器将为该连接生成 clientID。生成的 clientID 将标识套接字连接;对于落实方式 0 交互,它将标识 TPIPE 和相关联的“OTMA 异步挂起队列”。
IMS 资源适配器确保套接字与连接相关联,并使用该套接字来将带有输入数据的请求发送至 IMS Connect。然后,IMS Connect 将消息发送至 IMS,IMS 将运行事务并返回输出消息。
对于落实方式 0 交互,在接收输出消息时,IMS 资源适配器会在内部将 ACK 消息发送至 IMS,该消息将通知 IMS 废弃来自 IMS 队列的输出。当客户机应用程序关闭连接或者终止时,连接就会返回到连接池中,以供其它的落实方式 0 或落实方式 1 交互重用。
所有错误都会导致将资源异常抛出到客户机应用程序中。而且,某些错误还会导致套接字被 IMS Connect 断开连接。对于落实方式 0 交互,这就意味着无法将输出消息传递至客户机应用程序。对于可共享持久套接字上的落实方式 0 交互的未传递输出消息,不会将它们排队至具有自动生成的 clientID 的 TPIPE。此行为与正常的落实方式 0 处理不同。
处理未传递的输出消息的另一种方法是将异步输出重新路由至另一个目标。如果想要重新路由未传递的输出消息,则必须将 IMSInteractionSpec 属性 reRoute 设置为 TRUE。如果 reRoute 为 TRUE,则不会将异步输出排队至所生成的 clientID 的 TPIPE,而是会将它排队至由客户机提供的指定目标,该目标是在 IMSInteractionSpec 属性的 reRouteName 中指定的。此属性仅对于可共享持久套接字上的 SYNC_SEND_RECEIVE 交互有效。另外,如果将 purgeAsyncOutput 和 reRoute 都设置为 TRUE,则会抛出异常。
如果发生了执行超时,套接字连接仍然将打开。对于落实方式 0 交互,将把未传递的输出消息排队至具有自动生成的 clientID 的 TPIPE,或者将它们在 reRoute 目标上排队。对于落实方式 1 交互,未传递的输出是不可恢复的。
当客户机应用程序关闭连接或者终止时,连接就会返回到连接池中,因此,其它的落实方式 0 交互或落实方式 1 交互就可以重用它。
在正常情况下,当客户机应用程序执行落实方式 0 SYNC_SEND_RECEIVE 交互时,应用程序服务器将返回带有用户指定的 clientID 的现有连接,或者创建带有用户指定的 clientID 的新连接。用户指定的 clientID 标识套接字连接和 TPIPE 以及相关联的“OTMA 异步挂起队列”。
IMS 资源适配器确保套接字与连接相关联,并使用该套接字来将带有输入数据的请求发送至 IMS Connect。然后,IMS Connect 将消息发送至 IMS,IMS 将运行事务并返回输出消息。在接收输出消息时,IMS 资源适配器会在内部将 ACK 发送至 IMS,该 ACK 消息将通知废弃来自 IMS 队列的输出。当连接被关闭或者应用程序终止时,连接就会返回到连接池中,以供具有用户指定的相同 clientID 并且正在运行落实方式 0 交互的另一个应用程序重用。
所有错误都会导致将资源异常抛出到客户机应用程序中。而且,某些错误还会导致套接字被 IMS Connect 断开连接。对于落实方式 0 交互,这就意味着无法将输出消息传递至客户机应用程序。未传递的输出将被排队至与用户指定的 clientID 相关联的 TPIPE。
purgeAsyncOutput 和 reRoute 这两种属性不适用于专用持久套接字。不能清除或重新路由专用持久套接字上未传递的输出消息。
如果发生了执行超时,套接字仍然将保持打开,并且落实方式 0 交互的输出将排队至与用户指定的 clientID 相关联的 TPIPE,以供将来检索。当连接被关闭或者应用程序终止时,IMSManagedConnection 对象就会返回到连接池中,以供具有用户指定的相同 clientID 并且正在运行落实方式 0 交互的另一个应用程序重用。