Technical Blog Post
Abstract
使用IBM Java Toolbox for i 实现IBM i的作业管理(下)
Body
IBM Java Toolbox for i对IBM i子系统的编程支持
除队列之外,子系统也是IBM i的一大特色。为满足用户的各种需求,IBM i 支持多种类型的作业。不同种类的作业对系统资源的要求不同,比如,交互式作业要求较快的响应时间,批处理作业可能要求较多的CPU时间等。为了更加合理、有效地使用系统资源,系统(System)被划分成若干个子系统(Subsystem),所有的作业在子系统的监控下运行。因此,可以认为子系统是专门为了运行某一类作业而配置的环境。
从面向对象的编程模型角度,IBM Java Toolbox for i使用Subsystem类(位于com.ibm.as400.access包)描述IBM i子系统对象。
作为示例,清单4描述的是子系统QHTTPSVR对应的属性与功能,它服务于HTTP服务器作业。
清单 4. QHTTPSVR子系统
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
Subsystem sbs = new Subsystem(sys, "QHTTPSVR", "QHTTPSVR");
if (!sbs.exists()) {
System.out.println("No such subsystem: "+sbs.getPath());
}
else {
sbs.refresh();
System.out.println("Status: " + sbs.getStatus());
System.out.println("Number of jobs: " + sbs.getCurrentActiveJobs());
System.out.println("Maximum jobs: " + sbs.getMaximumActiveJobs());
// 等待1小时后停止子系统
sbs.end(3600);
}
// 作为好的编程习惯,释放连接
sys.disconnectAllServices();
与作业相同,子系统本身并不是一个IBM i对象,但子系统描述(Subsystem Description)是一种对象(*SBSD)。子系统描述定义了子系统中拥有的存储器资源,在子系统中运行的作业类型以及最大作业数等特征。与作业不同,每一个子系统描述仅对应一个子系统,因此,可以用子系统描述对象的名字来区分不同的子系统。
从面向对象的编程模型角度,虽然IBM Java Toolbox for i并未提供专门的SubsystemDescription类来描述IBM i子系统描述符对象,而是在使用Subsystem类创建一个子系统的同时,代码内部自动创建一个同名IBM i子系统描述对象。
作为示例,清单5描述的是创建子系统MYSUBSYS,与此同时,IBM i会生成一个同名的及子系统描述对象。
清单 5. 创建子系统以及子系统描述对象
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
// 创建子系统对象的同时,同名的子系统描述对象也被创建。
Subsystem sbs = new Subsystem(sys, "QSYS", " MYSUBSYS");
if (sbs.exists()) {
System.out.println("Subsystem Description: "+sbs.getPath() + " exists");
}
else {
sbs.create();
System.out.println("Subsystem Description: " + sbs.getPath());
System.out.println("Number of jobs: " + sbs.getCurrentActiveJobs());
System.out.println("Maximum jobs: " + sbs.getMaximumActiveJobs());
}
// 作为好的编程习惯,释放连接
sys.disconnectAllServices();
IBM Java Toolbox for i对IBM i内存池的编程支持
IBM i将整个存储资源切分成大小相同的小对象,成为内存池。内存池是逻辑的概念。
内存池有两种类型:共享池(Shared pool)和私有池(Private pool)。共享池允许若干个子系统共用,私有池只允许一个子系统转用。典型的共享池有*MACHINE、*BASE、*INTERACT和*SPOOL,对应的功能说明如表1所示:
表 1. 共享内存池
内存池 | 使用场景 |
*MACHINE | 主要用于系统作业 |
*INTERACT | 主要用于交互式作业 |
*SPOOL | 主要用于打印作业 |
*BASE | 适用于各种类型的作业,以批处理作业为主 |
从面向对象的编程模型角度,IBM Java Toolbox for i使用SystemPool类(位于com.ibm.as400.access包)描述IBM i的内存池对象。
作为示例,清单6描述的是共享池*SPOOL相关的内存池换页策略。
清单 6. 内存池换页策略
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
SystemPool systemPool = new SystemPool(sys, "*SPOOL");
// 获取内存池相关属性。
String pageOption = systemPool.getPagingOption();
if (pageOption.equals(systemPool.equals("*FIXED"))) {
System.out.println("The memory pool *SPOOL does not dynamically
adjust the paging characteristics..");
} else if (pageOption.equals("*CALC")) {
System.out.println("The memory pool *SPOOL dynamically adjusts the
paging characteristics. ");
} else if (pageOption.equals("USRDFN")) {
System.out.println("The memory pool *SPOOL does not dynamically
adjust the paging characteristics but uses values that have been
defined through an API.");
} else {
System.out.println("Unknown...");
}
// 作为好的编程习惯,释放连接
sys.disconnectAllServices();
需要说明的是,每个作业只能在一个内存池中运行。作业发生缺页时,换页也只能在同一池中进行,不会出现不同类型的作业发生内存冲突的现象,从而使系统对作业的管理做到有序、简单。
IBM i的这种内存池管理策略可能会出现各内存池之间忙闲不均的情况。因此,IBM i允许为每个内存池规定同时所允许存放的最多作业个数ACTLVL(Activity Level),解决性能问题。
IBM Java Toolbox for i对IBM i输出队列的编程支持
输出队列(Output Queue)是一种IBM i对象(类型为*OUTQ),用于存放等待打印的Spooled File。
系统人员需要经常对各种作业的Spooled File进行清理工作,不需打印时,就应将它们删掉,以减轻系统对作业的管理负担。
从面向对象的编程模型角度,IBM Java Toolbox for i使用OutputQueue类(位于com.ibm.as400.access包)描述IBM i的输出队列对象。
作为示例,清单7描述的是如何为清理IBM i输出队列的Spooled File。
清单 7. 清理输出队列
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
OutputQueue outQ = new OutputQueue(systemObject_, "/QSYS.LIB/NPJAVA.LIB/CLEARTST.OUTQ");
PrintParameterList pList = new PrintParameterList();
// 该方法创建脱机打印文件
createSpooledFiles(pList);
pList.setParameter(PrintObject.ATTR_JOBUSER, usr);
// 查询打印文件数量
int prevNum = outQ.getIntegerAttribute(PrintObject.ATTR_NUMFILES).intValue();
// 清理输出队列
outQ.clear(pList);
// 作为好的编程习惯,释放连接
sys.disconnectAllServices();
至此,我们分别从作业,作业队列,子系统,内存池,输出队列等各个不同的角度,介绍了如何使用IBM Java Toolbox for i实现针对IBM i作业管理的编程支持。
归结起来,我们可以从动态逻辑与静态配置的角度来阐述IBM i 工作管理和控制的结构与流程,如图4所示。
图4. IBM i 工作管理结构图
总结
IBM i作业管理是一个复杂的话题。针对IBM i的相关作业管理,如果操作对象是普通用户或者管理员,建议使用客户端命令行工具IBM Personal Communications (通常称为“绿屏”),或者GUI工具IBM Navigator for i(基于Web与Windows客户端两种)。而对于编程人员而言,IBM Java Toolbox for i是一个不错的选择。
参考资料
· 参看文章“Toolbox for Java 和 JTOpen” ,了解IBM Java Toolbox for i的概要信息。 · 参考“IBM Navigator for i”,了解更多有关IBM Navigator for i产品相关的的内容。 作者:皮光明
UID
ibm11145044