什么是 OPENAPI 程序?
开放式事务环境 (OTE) 是一个环境, CICS 应用程序代码可以在此环境中使用 CICS 地址空间内的非CICS 服务,而不受其他事务的干扰。 通过在 PROGRAM 资源定义中使用 OPENAPI 属性,可以通过将用户应用程序, PLT 程序,用户可替换模块或任务相关的用户出口 (TRUEs) 定义为 OPENAPI 程序来使用 OTE。 将程序定义为 OPENAPI 程序意味着从程序启动开始,它始终在 L8 或 L9 方式开放式任务控制块 (开放式 TCB) 上运行,而不是在主 CICS 拟重入 TCB (QR TCB) 上运行。
不能将全局用户出口定义为 OPENAPI 程序,但如果在 ENABLE PROGRAM 命令上使用 THREADSAFE 选项启用这些程序,那么必要时可以在开放式 TCB 上运行这些程序。
通过将应用程序工作负载从 QR TCB 移至多个开放式 TCB ,可以实现更高的吞吐量,特别是通过 CPU 密集型程序。 您可以使用其他非CICS API ,但必须注意,在 CICS 中使用非CICS API 完全由用户自行决定并承担风险。 尚未对 CICS 中的非CICS API 进行测试,并且 IBM 服务不支持使用此类 API。
线程安全需求
- 该程序必须向 CICS 定义为 CONCURRENCY (REQUIRED) ,这意味着该程序需要在开放式 TCB 上运行。
- 程序的逻辑 (即 EXEC CICS 命令之间的本机语言代码) 必须是线程安全的。 如果您向 CICS 定义要在开放式 TCB 上运行的程序,但包含非线程安全的应用程序逻辑,那么结果不可预测,并且 CICS 无法保护您不受可能的后果影响。
- 为了获得最佳性能,程序必须仅使用线程安全的 EXEC CICS 命令。 如果在开放式 TCB 上运行的程序中包含非线程安全的 EXEC CICS 命令,那么 CICS 会从开放式 TCB 切换回 QR TCB ,以确保安全地处理该命令。 TCB 切换可能会损害应用程序的性能。
- 为了获得最佳性能,该程序使用的执行路径中的任何用户出口程序也必须编码为线程安全标准,并将 CICS 定义为线程安全。 如果程序所使用的执行路径中的任何用户出口程序都不是线程安全的,那么 CICS 将切换到 QR TCB 以运行这些程序,这可能不利于应用程序的性能。
线程安全程序》 更详细地解释了线程安全程序的要求。
OPENAPI 程序的限制
OPENAPI 程序有一些额外的义务和限制。 例如,它们必须确保释放专门代表终止任务获取的所有非CICS 资源,并且它们不得使用某些 z/OS 系统服务。 OPENAPI 程序的线程安全限制 说明了这些需求。
用于定义为 REQUIRED OPENAPI 的候选程序 (假定它们的应用程序逻辑是线程安全的) 是那些希望使用其他非CICS API 的程序,它们会面临自己的风险。
OPENAPI 程序的 TCB
- L8 模式TCB用于 CICS 密钥OPENAPI应用程序,包括部分运行在 L8 TCB上的 CICS 程序,用于处理Web服务请求、解析XML以及访问 z/OS UNIX 文件以支持 CICS 网络服务。
- L9 方式 TCB 用于用户密钥 OPENAPI 应用程序。
当程序需要通过使用 ENABLE PROGRAM 命令上的 OPENAPI 选项启用 TRUE 来访问资源管理器时,也会使用 L8 方式 TCB。 开放式 API TRUE 在 L8 方式 TCB 下进行控制,并且可以在不创建子任务 TCB 的情况下使用非 CICS API。
CICS 自动控制 L8 和 L9 方式开放式 TCB 的池中 L8 和 L9 TCB 的数量。
使用 OPENAPI 程序可导致比普通线程安全程序更多的 TCB 切换。 如果 OPENAPI 程序使用了任何 EXEC CICS 命令或非线程安全的用户退出程序,导致切换到 QR TCB,则还需要额外的切换,因为 CICS 会切换回开放式 TCB 以继续运行应用逻辑。 由于要求 TCB 的键对于 OPENAPI 程序是正确的,因此可能涉及其他 TCB 切换。 OPENAPI TRUEs 始终在 L8 TCB 上的 CICS 密钥中运行,因此,例如,如果用户密钥 OPENAPI 程序在 L9 TCB 上运行,但进行 Db2® 调用,那么 CICS 切换到 L8 TCB 以调用 Db2,然后返回到 L9 TCB 以继续运行该程序。 由于此切换, CICS Db2 应用程序通常定义为 (CICSAPI) 线程安全程序,而不是 OPENAPI 程序。 如果需要,可以将 CICS 密钥 CICS Db2 应用程序定义为 OPENAPI 程序。