会话式事务

遵循此伪码以查看如何运行对话式 3270 事务。 说明了解决方案的潜在问题。

一个潜在问题是,在一个或多个阶段, 3270 事务需要进一步的数据才能继续。 网桥出口程序无法从客户机获取此数据。 即,它无法结束其当前激活 (要使用所需数据重新激活)-因为 3270 事务尚未完成,发出 EXEC CICS® RETURN 命令只会将控制权返回给后者。 出口程序也无法通过发出 EXEC CICS SYNCPOINT 命令 将信息返回到客户机,因为这将修改 3270 事务

一种解决方案是由网桥出口程序本身获取或计算所需数据。 也许更好的解决方案是出口程序创建子任务以获取数据。 例如,它可以创建单独的子活动 (客户机的孙代) 来处理 3270 事务发送的每个数据请求 (每个中间映射)。 为方便起见,我们将此类子活动称为 "对话活动"。 图 1 说明了此方法。
图 1。 将 3270 会话式事务作为 BTS 活动运行。 网桥出口程序创建子活动以处理 3270 事务发送的每个映射。
图为前文中描述的场景。 它显示与子活动通信的客户机活动。 子活动由 3270 事务和网桥出口程序组成。 它进而与会话式活动 (即客户机活动的外孙) 进行通信。 消息容器可由客户机活动和网桥出口程序访问。 请求容器可由网桥出口程序和会话式活动访问。

创建单独的活动以处理每个中间映射的一个可能问题是,出口程序在事务结束时发送到客户机的输出消息仅包含最终的 3270 映射。 如果保留中间消息很重要,那么会话式活动可能会将这些消息放入与客户机关联的其他容器中。

下表包含用于运行 3270 会话式事务的示例伪代码。

网桥出口程序

Read_Message.
encode conv-in-buffer from 3270-msg-out-buffer
EXEC CICS DEFINE ACTIVITY (next-conv-act-name)
TRANSID(conv-transaction-id)
RESP(data-area) RESP2(data-area) END-EXEC.
EXEC CICS PUT CONTAINER('Request')
ACTIVITY(next-conv-act-name)
FROM(conv-in-buffer)
RESP(data-area) RESP2(data-area) END-EXEC.
EXEC CICS LINK ACTIVITY(next-conv-act-name)
RESP(data-area) RESP2(data-area) END-EXEC.
EXEC CICS CHECK ACTIVITY(next-conv-act-name)
COMPSTATUS(status) ABCODE(a)
RESP(data-area) RESP2(data-area) END-EXEC
If status NOT = DFHVALUE(NORMAL)
EXEC CICS ABEND ABCODE(a)
NODUMP
RESP(data-area) RESP2(data-area) END-EXEC
End-If..
EXEC CICS GET CONTAINER('Request')
ACTIVITY(next-conv-act-name)
INTO(3270-msg-in-buffer)
RESP(data-area) RESP2(data-area) END-EXEC..
Write_Message.
Intermediate writes cannot be sent
to the client.
EXEC CICS NOOP
RESP(data-area) RESP2(data-area) END-EXEC.
"对话" 活动

WHEN DFH-Initial
EXEC CICS GET CONTAINER('Request')
INTO(msg-in-buffer)
RESP(data-area) RESP2(data-area) END-EXEC.
decode msg-in-buffer
encode msg-out-buffer.
EXEC CICS PUT CONTAINER('Request')
FROM(msg-out-buffer)
RESP(data-area) RESP2(data-area) END-EXEC.
EXEC CICS RETURN END-EXEC

出口程序发出 LINK ACTIVITY (而不是 RUN ACTIVITY SYNCHRONOUS) 命令以激活 "会话式" 子活动。 这对于确保子代在与出口程序相同的工作单元中执行是必需的。