![[UNIX、Linux、Windows、IBM i]](ngmulti.gif)
使用 MQCONNX 的共享(独立于线程)连接
使用此信息以了解使用 MQCONNX 的共享连接以及要考虑的一些使用说明。
请注意: Not supported on IBM® MQ for z/OS®.在 Multiplatforms 版上,使用 MQCONN 建立的连接仅对建立该连接的线程可用。 针对 MQCONNX 调用的选项允许创建可由进程中所有线程共享的连接。 如果运行应用程序的事务环境需要在相同线程上发出 MQI 调用,那么必须使用以下缺省选项:
MQCNO_HANDLE_SHARE_NONE- 创建非共享连接。
在其他多数环境中,可使用以下其中一个独立于线程的共享连接选项:
MQCNO_HANDLE_SHARE_BLOCK- 创建共享连接。 在
MQCNO_HANDLE_SHARE_BLOCK连接上,如果连接当前由其他线程上的 MQI 调用使用,那么 MQI 调用会等待,直到完成当前 MQI 调用。 MQCNO_HANDLE_SHARE_NO_BLOCK- 创建共享连接。 在
MQCNO_HANDLE_SHARE_NO_BLOCK连接上,如果连接当前由另一个线程上的 MQI 调用使用,那么 MQI 调用会立即失败,且会返回原因MQRC_CALL_IN_PROGRESS。
除 MTS ( Microsoft Transaction Server) 环境外,缺省值为 MQCNO_HANDLE_SHARE_NONE。 在 MTS 环境中,缺省值为 MQCNO_HANDLE_SHARE_BLOCK。
将从 MQCONNX 调用返回连接句柄。 此句柄可由来自进程内任何线程的后续 MQI 调用使用,方法是将这些调用与从 MQCONNX 返回的句柄关联。 使用单个共享句柄的 MQI 调用在线程中进行序列化。
例如,通过共享句柄,以下活动序列是可行的:
- 线程 1 发出 MQCONNX 并获取共享句柄 h1
- 线程 1 打开队列并使用 h1 发出 get 请求
- 线程 2 使用 h1 发出 put 请求
- 线程 3 使用 h1 发出 put 请求
- 使用 h1 的线程 2 问题 MQDISC
句柄由任何线程使用时,对连接的访问权不可用于其他线程。 在可接受线程等待来自另一个线程的任何先前调用完成的情况下,请将 MQCONNX 与选项 MQCNO_HANDLE_SHARE_BLOCK配合使用。
但是,阻塞会导致出现困难。 假设在步骤 2中,线程 1 发出一个 get 请求,等待可能尚未到达的消息 (具有 wait 的 get)。 在此情况下,线程 2 和 3 也会保持等待(已阻塞)线程 1 上 get 请求等待所花的时间。 如果您希望 MQI 调用返回错误 (如果另一个 MQI 调用已在句柄上运行) ,请将 MQCONNX 与选项 MQCNO_HANDLE_SHARE_NO_BLOCK配合使用。
共享连接使用说明
- 任何通过打开对象创建的对象句柄 (Hobj) 都与 Hconn 关联;因此针对共享 Hconn,任何线程还可使用 Hconn 共享和使用 Hobjs。 同样,任何在 Hconn 下启动的工作单元都与此 Hconn 关联;因此,此工作单元也可在具有共享 Hconn 的线程中共享。
- 任何线程而不仅仅是调用相应 MQCONNX 的线程,都可调用 MQDISC 以与共享 Hconn 断开连接。 MQDISC 终止 Hconn,使其不可用于所有线程。
- 单个线程可按顺序使用多个共享 Hconn,例如,使用 MQPUT 将一个消息放置在一个共享 Hconn 下,然后使用另一个共享 Hconn 放置另一个消息,每个操作都在不同本地工作单元下执行。
- 无法在全局工作单元中使用共享 Hconn。