进程通信是操作系统内核中非常重要的部分。对于IBM i而言,数据队列是一种非常重要的进程通信方式。 一方面,数据队列功能强大,不受编程语言的限制,并能同时支持进程的同步通信与异步通信;另一方面,数 据队列使用灵活,其数据消息不受任何格式束缚,换句话说,用户可以根据业务需求自定义数据格式。作为 IBM i的Java 应用程序编程接口,IBM Java Toolbox for i支持IBM i数据队列的相关操作,这样,Java应用 程序与其它IBM i程序(诸如C,RPG,COBOL程序)之间的通信就变得简单、容易。本文的目标是:从面向程序 设计的角度,指导读者如何使用IBM Java Toolbox for i,实现基于IBM i数据队列的进程通信。有关IBM Java Toolbox for i的基础知识,请参见另一篇技术文档“Toolbox for Java 和 JTOpen”。
从结构上,本文主要分为3部分。第1部分简要介绍数据队列的基础知识,包括数据队列的基本概念,工作 方式,使用场景,以及与其它通信方式的区别。第2部分则集中介绍IBM Java Toolbox for i针对数据队列的 编程支持。在这一部分中,我们将结合生产者与消费者问题相关的样例,指导读者如何使用IBM Java Toolbox for i完成进程间的通信。最后一部分是总结。
本文的样例主要包含两部分。第1部分是IBM i数据队列的相关基础操作,包括队列创建,入队,出队,清 空队列,队列删除共计5种。第2部分是进阶篇,实现的是生产者与消费者的原型。其中,生产者进程的任务是 向产品队列中不断添加产品,而消费者一直处于监听状态,只要发现队列不为空,则从队列中取走产品。
IBM i数据队列的工作原理
与Unix,Window不同,IBM i是一种面向对象的操作系统。从这个角度而 言,数据队列是一种系统对象,对应的类型为*DTAQ。IBM i数据队列的设计目标是提供一种高效的进程通信方 式。
狭义上讲,队列是一种先进先出(或FIFO)的数据结构,如图1。它只允许在对头进行删除操作(称为出队 ),而在队尾进行插入操作(入队)。
图 1. 队列的工作方式
列则是一种广义上的队列,或者说它是队列以及队列的变种。按数据队列的出队策略划分,IBM i支持3种类型的数据队列:
先进先出(或FIFO)—— 第一条(最旧)队列消息,位于队头最先出队。这与狭义的FIFO队列等价。
先进后出(或LIFO)—— 最后一条(最新)队列消息,位于队头最先出队。它实际上是一种栈结构。
按索引出队 —— 每条队列消息对应一个索引。与索引规则匹配的队列消息出队。其中,按索引检索的规 则包括操作符 =,>,>=,<,<= 等。
除数据队列之外,IBM i还支持其它各种数据存储对象,包括数据库文件,消息队列,数据区(Data Area ),用户空间(User Space)等等。但是他们的使用方式与应用场景不同。数据队列的主要目标是进程通信, 队列消息的格式不受限制,用户可根据业务需求自由定义;数据库文件的服务对象是数据库相关的增删改查等 操作,数据记录有严格的数据格式;消息队列存储的对象是IBM i消息,消息队列本身并不具备队列的数据结 构;数据区对象的存储空间有限,通常用于存放IBM i作业之间的共享数据;用户空间对象通常用来存储用户 的自定义信息,方便在进程间共享数据。