Как получить определенный список заданий из AS400?

Я пытаюсь получить список активных процессов, соответствующих моим критериям. У меня уже есть рабочая реализация, использующая JobList, которая использует объект 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:

 Subsystem sbs = new Subsystem(as400Environment, subsystRequired, subsystRequired);

Но я не могу получить список вакансий в виде строки, только как целое число, чтобы сказать мне, сколько есть вакансий.

Есть ли способ немедленно вернуть список заданий с ограниченными накладными расходами? Я все еще просматриваю API, но если у кого-то есть какие-либо рекомендации, я был бы очень признателен.


person Nathan    schedule 24.04.2014    source источник
comment
что подразумевается под получением списка заданий в виде строки? Каков корень того, что вы хотите сделать? Вы пытаетесь получить все вакансии? Только задания, оставившие записи в *OUTQ? Активные вакансии? (Вы не показываете никаких критериев выбора.) Когда вы говорите, что на некоторых компьютерах это занимает 10 минут, это клиентские системы или серверы? Является ли это клиентским запросом к удаленному серверу или это Java, который всегда работает на сервере? Является ли это проблемой производительности Java, или просто на некоторых компьютерах есть сотни тысяч рабочих мест. (Я видел оба случая.)   -  person user2338816    schedule 24.04.2014
comment
Критерии поиска являются динамическими, пользователь — это тот, кто хочет просмотреть конкретную систему и задания на ней, исходный код перебирает все задания, проверяя, является ли он частью требуемой системы/библиотеки. Это всегда клиентский запрос, работающий с драйвером JDBC, и это просто сотни тысяч заданий на определенных компьютерах. Я новичок в этом, если честно, всего несколько недель знаний.   -  person Nathan    schedule 24.04.2014
comment
Что означает часть системы/библиотеки, требуемая? Конечно, все задания всегда будут частью любой системы, из которой извлекается список, но как библиотека участвует в качестве критерия «задания»?   -  person user2338816    schedule 24.04.2014
comment
Общий результат этого заключается в том, что пользователь будет иметь контроль над процессами, работающими в определенных системах. В каждой системе будут выполняться систематические задания, и я хотел только показать их пользователю, но не смог найти обходной путь использования чего-либо, кроме перечисления, которое может в конечном итоге переключаться между тысячами и тысячами записей и требует очень много времени. И извините, я просто имел в виду систему, которую указывает пользователь, а не систему/библиотеку.   -  person Nathan    schedule 25.04.2014


Ответы (1)


Можно запросить подмножество заданий в системе; чтобы IBM выполняла работу по фильтрации, а не возвращала все задания, а ваш код выполнял эту фильтрацию. Отвечает ли 16359926 помощь ?

EDIT: код для грубого фильтра

Я думаю, что понимаю проблему. Вы хотите выбрать задания, работающие в определенной подсистеме, но addJobSelectionCriteria не включает SUBSYSTEM в качестве одного из возможных вариантов для фильтрации. Один из способов уменьшить количество возвращаемых вам заданий — фильтровать только активные задания:

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);

Когда у вас будет список активных заданий, вам нужно будет протестировать подсистему в вашем коде, прокручивая Enumeration. Один из способов сделать это более эффективным состоит в том, чтобы вызов 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 активных заданий, выбирая около 75 в QINTER менее чем за 1 секунду.

person Buck Calabro    schedule 24.04.2014
comment
Это вроде того, как я его настроил, но из-за перечисления требуется время, чтобы переключиться, так как могут выполняться сотни тысяч заданий. У меня не будет доступа к конкретным вещам, таким как номера заданий, только имя подсистемы, поэтому я надеялся построить ее именно так. Спасибо за попытку помочь! - person Nathan; 25.04.2014
comment
@ Натан Тем не менее, можно ли выполнить какую-либо фильтрацию на стороне сервера? В частности, будет ли конечный пользователь заинтересован только в тех заданиях, которые активно выполнялись на момент запроса, или в тех, которые были завершены? Это может потенциально уменьшить количество на два или три порядка. Любая фильтрация на стороне сервера будет полезна. Если никакая фильтрация невозможна, то она всегда будет зависеть от среды и будет иметь большую изменчивость. - person user2338816; 25.04.2014
comment
@user2338816 user2338816 Я рассмотрю возможность применения фильтра, их будут интересовать только активно выполняемые задания, я создам фильтры, применю их и протестирую. Спасибо за помощь ребята ! - person Nathan; 25.04.2014