Java 如何从AS400中检索特定的作业列表?

Java 如何从AS400中检索特定的作业列表?,java,ibm-midrange,jt400,Java,Ibm Midrange,Jt400,我正在尝试检索符合我的条件的活动进程列表。我已经有了一个工作实现,它使用了一个使用as400对象的作业列表: // New as400 object as400Environment = new AS400(); as400Environment.setSystemName(systemName); as400Environment.setUserId(userID); as400Environment.setPassword(password); // New Job list JobLi

我正在尝试检索符合我的条件的活动进程列表。我已经有了一个工作实现,它使用了一个使用as400对象的作业列表:

// New as400 object

as400Environment = new AS400();
as400Environment.setSystemName(systemName);
as400Environment.setUserId(userID);
as400Environment.setPassword(password);

// New Job list
JobList jobList = new JobList(as400Environment);
Enumeration e = jobList.getJobs();

while(e.hasMoreElements()) {

    // Store current job
    Job j = (Job) e.nextElement();

    // Do things with the job ........
}
但这需要很长时间才能找到我需要的东西的根源,在某些计算机上需要10分钟

我已经开始考虑使用子系统:

 Subsystem sbs = new Subsystem(as400Environment, subsystRequired, subsystRequired);
但我似乎无法将作业列表作为字符串获取,只能作为一个整数来告诉我有多少个作业


是否有任何方法可以立即返回开销有限的作业列表?我现在还在看API,但如果有人有任何指导,我将不胜感激

可以请求系统上作业的子集;为了让IBM做过滤工作,而不是返回所有作业并让您的代码进行过滤。答案有用吗

编辑:原油过滤器代码

我想我理解这个问题。您希望选择在特定子系统中运行的作业,但addJobSelectionCriteria不将子系统作为筛选的可能选项之一。减少返回给您的作业数量的一种方法是仅筛选活动作业:

JobList jobList = new JobList(system);
jobList.clearJobSelectionCriteria();
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);
一旦有了活动作业的列表,就需要通过循环枚举来测试代码中的子系统。提高效率的一种方法是让对getJobs()的调用在返回的属性列表中包含子系统名称。这将启用getValue()而不是getSubsystem()的使用。getSubsystem()会导致对系统API的另一次调用,以获取该信息,因此效率有点低

jobList.clearJobAttributesToRetrieve();
jobList.addJobAttributeToRetrieve(Job.SUBSYSTEM);
下面是一个简单的例子:

import java.util.*;
import com.ibm.as400.access.*;

public class TestGetJobList {
    public static void main(String[] args) {
       int raw=0;
       int selected=0;

try {
    AS400 system = new AS400();

    // Create a list and subset it
       // looking for all jobs in QINTER, but subsystem is not in the list of things we can filter on
       // so filter the list as small as possible and then this code will pick through that list
    JobList jobList = new JobList(system);
    jobList.clearJobSelectionCriteria();
    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);

       // we can eliminate another call to the system API by adding subsystem to the attributes retrieved in the getJobList()
    jobList.clearJobAttributesToRetrieve();
    jobList.addJobAttributeToRetrieve(Job.SUBSYSTEM);
    jobList.addJobAttributeToRetrieve(Job.JOB_NAME);
    jobList.addJobAttributeToRetrieve(Job.JOB_NUMBER);
    jobList.addJobAttributeToRetrieve(Job.USER_NAME);

       // get the list of jobs
    Enumeration list = jobList.getJobs();

    while (list.hasMoreElements())  {
        Job  j= (Job) list.nextElement();
               raw++;    // count them

               // choose jobs in one subsystem
               // this is pretty efficient because we told getJobs() to include the subsystem in the first retrieval
               if (j.getValue(Job.SUBSYSTEM).toString().substring(0, 6).equals("QINTER")) {
                 selected++;
                 System.out.println(j.getValue(Job.JOB_NUMBER) + "/" +
                   j.getValue(Job.USER_NAME) + "/" +
                   j.getValue(Job.JOB_NAME) );
                 }
        }

    System.out.println(raw + " raw jobs found");
    System.out.println(selected + " QINTER jobs found");
    System.exit(0);

    } catch (Exception e) {
        e.printStackTrace();
    }

    }
}

这将处理500个活动作业,在1秒内选择75个作业。

什么是“以字符串形式获取作业列表”?你想做什么的“根源”是什么?你想得到所有的工作吗?仅在*OUTQ上留下条目的作业?活跃的工作?(您没有显示任何选择标准。)当您说“在某些计算机上”需要10分钟时,这些是客户端系统还是服务器?这是针对远程服务器的客户端请求,还是始终在服务器上运行的Java?这是一个Java性能问题,还是仅仅在“某些计算机上”有成百上千个作业。(我见过这两种情况。)搜索条件是动态的,用户是想要查看特定系统及其上的作业的人,原始代码遍历所有作业,检查它是否是所需系统/库的一部分。它始终是一个通过JDBC驱动程序运行的客户机请求,在某些计算机上,它只是数十万个作业。老实说,我对这一点还不熟悉,只有几周的时间。什么是“所需系统/库的一部分”呢?当然,所有作业都将始终是从中检索列表的任何系统的一部分,但是“库”作为“作业”标准是如何涉及的呢?这样做的总体结果是用户将控制某些系统中运行的进程。每个系统都会运行系统化的作业,我只想向用户显示它们,但除了枚举之外,找不到一种解决方法。枚举最终会在成千上万条记录中移动,而且非常耗时。抱歉,我刚才指的是用户指定的系统,而不是系统/库。这有点像我设置它的方式,但由于枚举,它需要时间转换,因为可能会有数十万个作业在运行。我无法访问特定的东西,比如工作编号,只有子系统的名称,所以这就是我希望构建它的方式。谢谢你的帮助@Nathan,还有什么可以做的服务器端过滤吗?特别是,最终用户是否只对请求时正在运行的作业感兴趣,还是对已经完成的作业感兴趣?这可能会使计数减少两到三个数量级。任何服务器端过滤都会很有帮助。如果不可能进行筛选,那么它将始终取决于环境,并且具有很大的可变性。@user2338816我将研究如何尝试应用筛选器,他们只对主动运行作业感兴趣,我将创建筛选器,应用它们并测试它。谢谢你们的帮助,伙计们!