CICS 任务和线程管理

CICS® 使用开放式事务环境 (OTE) 来运行 JVM 服务器工作。 每个任务在 JVM 服务器中作为线程运行,并使用 T8 TCB 进行连接。 使用 OSGi 的主要优点是 OSGi 框架中的应用程序可以使用 ExecutorService 来创建以异步方式在 CICS 中运行额外任务的线程。 CICS 采取特殊措施来处理失控任务。

当 CICS 启用 JVM 服务器时, JVM 服务器将在 Language Environment ® 进程线程上运行。 此线程是 TP TCB 的子代。 每个 CICS 任务都通过使用 T8 TCB 连接到 JVM 中的线程。 您可以通过在 JVMSERVER 资源上设置 THREADLIMIT 属性来控制可供 JVM 服务器使用的 T8 TCB 数。

为 JVM 服务器创建的 T8 TCB 存在于虚拟池中,并且无法由同一 CICS 区域中运行的另一个 JVM 服务器复用。 在所有 JVM 服务器中, CICS 区域中可以存在的 T8 TCB 的最大数目为 2000 ,而特定 JVM 服务器的最大数目为 256。

多线程应用程序

在 OSGi 框架中运行的 Java™ 应用程序还可以使用 ExecutorService OSGi 服务异步启动 CICS 任务。 JVM 服务器在启动时将 ExecutorService 注册为 OSGi 服务。 ExecutorService 自动使用 CICS 提供的实现,该实现创建可使用 JCICS API 访问 CICS 服务的线程。 此方法意味着应用程序不必使用特定的 JCICS API 方法来创建线程。 但是,应用程序还可以使用 CICSExecutorService 在支持 CICS 的单独线程上运行工作。

启用 JVM 服务器后,它将启动 CJSL 事务以创建称为 JVM 服务器侦听器的长时间运行的任务。 此侦听器等待来自应用程序的新线程请求,并运行 CJSA 事务以创建在 T8 TCB 上分派的 CICS 任务。 下图中显示了此过程:

此图显示了正在 OSGi 框架中运行的 Java 应用程序接收的进入 CICS 区域的应用程序请求。 应用程序创建线程,线程侦听器在 T8 TCB 上启动新任务并运行 JCICS 以访问 VSAM。

在高级方案中,应用程序可以使用 OSGi 服务以异步方式运行许多线程。 这些线程都可以通过 JCICS 访问 CICS 服务,并在 T8 TCB 下运行。

JVM 服务器的执行密钥

Java 程序必须使用在正确执行键中运行的 JVM。 JVM 服务器在 CICS 密钥中运行。 要使用 JVM 服务器, Java 程序的 PROGRAM 资源必须将 EXECKEY 属性设置为 CICS。 CICS 使用 T8 TCB 来运行 JVM 并获取 CICS 密钥中的 MVS™ 存储器。

失控任务

CICS JVM 服务器基础结构支持使用任务失控检测机制。 与传统 CICS 任务不同,在 T8 TCB 上运行 Java 的任务不能在对同一 JVM 中的其他工作负载造成影响的情况下终止。 Language Environment 和 JVM 服务器在符合 POSIX的环境中运行,这要求如果 TCB/Thread 终止,父进程也会终止。 反过来,所有子进程会突然终止-并导致 JVM 中的所有任务立即失败。

在 JVM 服务器中运行的超出修改后的 RUNAWAY 时间间隔的任务迂到更受控的终止过程。 这与传统的 CICS 行为不同,您应该评估是要将失控时间间隔应用于 Java 任务,还是要设置哪些值。

JVMSERVER 控制的失控处理

当运行 Java 的任务迂到失控时间间隔条件时, JVMSERVER 将拦截该条件并触发 DISABLE PHASEOUT。 将阻止新工作进入 JVM ,并使现有工作放弃。 随后,如果任务完成其处理,那么 JVMSERVER 将重新启用并可用于新请求。 在许多情况下,如果运行 Java 的任务超过失控时间间隔值,那么它很可能是一个错误的应用程序,例如一个紧循环的应用程序,并阻止 JVMSERVER 的 PHASEOUT/RECYCLE 成功。 检测到应用程序时,失控计时器将在另一个时间间隔后再次触发,并且 JVMSERVER DISABLE PHASEOUT 将升级到 JVMSERVER DISABLE PURGE。 其余任务将接受 PURGE 处理,并且在大多数情况下将终止。 如果超出进一步的失控时间间隔,那么 JVMSERVER DISABLE 将升级到 FORCEPURGE ,最终升级到 KILL -直到强制终止所有正在运行的任务为止。 JVMSERVER 会重新启动回 ENABLED 状态,以便为新请求做好准备。 如果 JVMSERVER 必须升级到 DISABLE KILL 请求,请谨慎地尽早重新启动 CICS 。

已修改的失控时间间隔值

在 JVM 服务器中运行的任务的失控情况可能导致整个 JVM 服务器的临时可用性问题。 因此, CICS 通过将配置的失控时间间隔值乘以 10 (最大值为 45 分钟) 来修改该值。 此新值是有效失控时间间隔。 此较高的失控时间间隔降低了检测到低效 (但以其他方式工作) 应用程序的失控情况的可能性。 例如,如果事务定义指定 RUNAWAY=SYSTEM,并且 ICVR 系统初始化参数指示缺省限制为 5000 毫秒,那么该任务在 JVM 服务器中运行时的有效失控时间间隔为 50000 毫秒。

设置失控时间间隔值

缺省情况下,用于 Liberty JVM 服务器的 CJSA 事务定义以及用于从 CICSExecutorService 启动的 OSGi JVM 服务器中的工作的 CJSA 事务定义已激活失控检测并设置为系统时间间隔。 如果您不希望失控时间间隔应用于这些任务,那么可以在自己的事务定义下运行工作,并且失控时间间隔设置为 0 或您选择的其他值。 Liberty 工作负载通常由 URIMAP 控制,而 CICSExecutorService 提供 CICSTransactionRunnableCICSTransactionCallable 接口以允许使用定制事务定义。