IBM Support

使用IBM Java Toolbox for i 实现IBM i的作业管理(下)

Technical Blog Post


Abstract

使用IBM Java Toolbox for i 实现IBM i的作业管理(下)

Body

   

IBM Java Toolbox for iIBM 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 iIBM 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 iIBM 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(基于WebWindows客户端两种)。而对于编程人员而言,IBM Java Toolbox for i是一个不错的选择。

参考资料

·         参看文章“Toolbox for Java JTOpen” ,了解IBM Java Toolbox for i的概要信息。

·         参考IBM Navigator for i,了解更多有关IBM Navigator for i产品相关的的内容。

 

作者:皮光明 

[{"Business Unit":{"code":"BU054","label":"Systems w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":"","Line of Business":{"code":"LOB08","label":"Cognitive Systems"}}]

UID

ibm11145044