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 i 实现IBM i的作业管理

通俗地讲,IBM i 作业管理的内容是负责处理用户或程序提交的系统请求,它是IBM i平台的基本功能之一。不同于WindowsUnix,围绕IBM i作业管理的概念较多,如作业,作业描述符,作业队列,子系统,子系统描述符,内存池,输出队列等。而本文的目标是:围绕IBM i作业管理的相关概念,指导读者如何使用IBM Java Toolbox for i实现对IBM i作业管理的编程支持。有关IBM Java Toolbox for i的基础知识,请参见另一篇技术文档Toolbox for Java JTOpen 

从内容上,本文主要分为5大部分。第1部分,我们以作业为中心,集中介绍IBM Java Toolbox for iIBM i作业相关的编程支持。第2部分,主要介绍IBM Java Toolbox for iIBM i子系统相关的编程支持。第3部分,介绍IBM Java Toolbox for iIBM i内存池相关的编程支持,第4部分,简要介绍IBM Java Toolbox for iIBM i输出队列相关的编程支持。最后一部分是总结。 

IBM Java Toolbox for iIBM i作业的编程支持

作业是IBM i对工作进行管理的基本单位,也是系统分配资源的基本单位。从这个意义上说,IBM i的作业等价于其它操作系统的进程。

IBM i作业的工作原理

从作业交互的角度划分,IBM i作业可简单分为用户交互式与批处理两种。下面,我们分别它们的工作原理。 

交互式作业的工作原理比较简单,通常会按以下步骤运行:

生命周期从用户登录开始;

对于交互式作业,IBM i 立即响应并运行;

如涉及数据打印,则将数据输出至输出队列(Output Queue)中的一个脱机打印文件(以下称 Spooled File)里,等待队列中排前的打印作业完毕,开始打印文件;

生命周期以用户注销结束。 

相比而言,批处理作业的工作原理复杂一些,如图1所示。 

1. 批处理作业的工作原理

图像   

 对于批处理作业,通常会按以下步骤运行:

生命周期从执行CL命令Submit Job (SBMJOB) 提交批处理作业开始;

i 会根据某种调度策略,将作业加入到合适的作业队列,但并不意味着该作业立即获得运行的机会。

当子系统发现这个作业所需的资源均已准备好后,才运行这个作业;

一旦作业获得运行的机会,子系统调度内存池为其分配资源,从而运行该作业。

如涉及数据打印,对应的操作与交互式作业一样。

以批处理作业执行完成而结束。

IBM Java Toolbox for i针对IBM i作业的编程支持

从面向对象程序设计的角度,IBM Java Toolbox for i使用JobJobListJobLog三个主要Java类描述IBM i作业的相关功能操作,三者均位于com.ibm.as400.access包,对应的类图如图2所示。其中,Job类用于描述IBM i作业的常规属性与方法;JobLog类表示IBM i作业对应的作业日志;而作为帮助类,JobList类则描述按指定规则过滤的作业列表。

2. 作业相关的Java类图

图像  

作为示例,清单1描述的是运行在IBM iHTTP服务器ADMIN对应的作业以及作业日志。这里,我们围绕HTTP服务器对应的作业,默认系统用户为QTMHHTTP,作业名为ADMIN。通过JobList类提供的作业过滤规则,我们只列出ADMIN服务器对应的活动作业。通过JobLog提供的作业日志,我们可以查看ADMIN服务器的作业日志。

清单 1. 打印ADMIN作业与作业日志

// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。

AS400 sys = new AS400(system, usr, pwd);

// 设置过滤规则,查询作业列表

JobList jobList = new JobList(sys);

JobList.addJobSelectionCriteria(JobList.SELECTION_USER_NAME, "QTMHHTTP");

jobList.addJobSelectionCriteria(JobList.SELECTION_JOB_NAME, "ADMIN");

jobList.addJobSelectionCriteria(JobList.SELECTION_PRIMARY_JOB_STATUS_ACTIVE,Boolean.TRUE);

jobList.addJobSelectionCriteria(JobList.SELECTION_PRIMARY_JOB_STATUS_JOBQ,Boolean.FALSE);

JobList.addJobSelectionCriteria(JobList.SELECTION_PRIMARY_JOB_STATUS_OUTQ,Boolean.FALSE);

// 循环打印作业相关属性

Enumeration list = jobList.getJobs();

while (list.hasMoreElements()) {

  Job job = (Job) list.nextElement();

   System.out.println("The job log of " + job.getName() + "/"+ job.getUser() + "/" +

      job.getNumber() + " is:");

   // 打印作业日志

   JobLog jobLog = job.getJobLog();

   Enumeration messageList = jobLog.getMessages();

   while (messageList.hasMoreElements()) {

      AS400Message message = (AS400Message) messageList.nextElement();

      System.out.println(message.getText());

   }

}

// 作为好的编程习惯,释放连接

sys.disconnectAllServices();

IBM Java Toolbox for i针对IBM i作业描述符的编程支持

如果说作业是一个动态的概念,那么作业描述对象则相对静态的概念。作业描述(Job Description)是一种IBM i对象(类型*JOBD),包含了作业的诸多属性值。

IBM i系统上有多种作业描述对象。作业描述对象与作业形成1N的关系。每一个作业都对应一个作业描述对象。但每一个作业描述对象可以有多个作业与它相关。IBM 提供的默认作业描述是 QDFTJOBD

我们可以使用CL命令Display Job Description (DSPJOBD)查看作业描述对象QDFTJOBD的相关属性,如图3所示:

3. DSPJOBD —— 默认作业描述对象

图像  

 从面向对象的编程模型角度,IBM Java Toolbox for i使用JobDescription类(位于com.ibm.as400.access包)表示IBM i作业描述对象。

作为示例,清单2描述的是IBM i 默认作业描述对象QDFTJOBD的相关属性,功能与上述DSPJOBD命令等价。

清单 2. 打印作业描述对象QDFTJOBD的属性

// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。

AS400 sys = new AS400(system, usr, pwd);

// 打印QDFTJOBD的属性

JobDescription jd = new JobDescription(sys, "QGPL", "QDFTJOBD");

System.out.println("User: " + jd.getUserName() + ", Job Queue: " + jd.getJobQueueName() +  

   ", Output Queue: " + jd.getOutputQueueName());

// 作为好的编程习惯,释放连接

sys.disconnectAllServices();

IBM Java Toolbox for i对作业队列的编程支持

作业队列(Job Queue)是一种IBM i对象(类型为*JOBQ)。系统中存在多个作业队列,每一个作业队列包含一组等待处理的批处理作业。

从面向对象的编程模型角度,虽然IBM Java Toolbox for i并未提供专门的JobQueue类表示IBM i作业队列,但是,Job类与JobDescription类提供了作业队列相关的常用功能。

作为示例,清单3描述的是HTTP服务器作业ADMIN对应的作业队列,以及作业在队列中的当前状态。

清单 3. 打印作业队列中ADMIN作业的状态

// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。

AS400 sys = new AS400(system, usr, pwd);

Job job = new Job(sys, "ADMIN", "QTMHHTTP", "846441");

// 打印作业队列的路径

String jobQueue = job.getQueue();

System.out.println("Job Queue: " + jobQueue);

// 打印作业队列中此作业的状态

String status = job.getJobStatusInJobQueue();

if (status.equals(Job.JOB_QUEUE_STATUS_BLANK )) {

   System.out.println("This job was not on a job queue.");

} else if (status.equals(Job.JOB_QUEUE_STATUS_HELD)) {

   System.out.println("This job is being held on the job queue.");

} else if (status.equals(Job.JOB_QUEUE_STATUS_SCHEDULED)) {

   System.out.println("This job will run as scheduled.");

} else if (status.equals(Job.JOB_QUEUE_STATUS_READY  )) {

   System.out.println("This job is ready to be selected.");

} else {

   System.out.println("Unknown...");

}

// 作为好的编程习惯,释放连接

sys.disconnectAllServices();

实际上,队列是IBM i的一大特色。IBM i有很多类型的队列,包括作业队列,输出队列,消息队列,数据队列等等。 

 

作者:皮光明 

 

[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":"","Line of Business":{"code":"LOB57","label":"Power"}}]

UID

ibm11145038