Можно ли повторно использовать JVM, созданную в другом задании OS/400 из RPG?

У меня есть RPG PGM, который вызывает класс Java, если в задании нет JVM, среда выполнения RPG добавляет ее при вызове класса Java. После этого все вызовы, поступающие из одной и той же программы RPG или другой программы RPG в том же задании, используют одну и ту же JVM.

Дело в том, что если я запускаю ту же программу PRG из другого задания, она запускает другую JVM, в основном у меня есть одна JVM для задания.

Я хочу знать, возможно ли иметь только одну JVM и подключаться к ней из других заданий.

Любая помощь будет оценена.

Вот как я пытаюсь интегрировать RPG/JAVA через процедуры. Но почему-то темы не запускаются.

========
RPG CODE
========

d DSP_class       c                   'tests.mthreads.RPGProcessDispatcher'
d DSP             s               o   class(*JAVA:DSP_class)           

d DSP_new         pr              o   extproc(*JAVA:                   
d                                     DSP_class:                       
d                                     *CONSTRUCTOR)                    

d DSP_dispatch    pr              n   extproc(*JAVA:                   
d                                     DSP_class:                       
d                                     'dispatch')                      


d dispatcher      s                   like(DSP)
d dispatched      s               n            

d i               s              3i 0          
  /free                                         
     dispatcher = DSP_new();                   
     for i=1 by 1 to 2;                        
        dispatched = DSP_dispatch(dispatcher); 
      endfor;                                   

      *inlr=*on;   
  /end-free        


RPGProcessDispatcher
====================

public boolean dispatch() {
    if (freeThreads == 0) {
        return false;
    }

    System.out.println("Tread @"+freeThreads);
    decThreadsAvailable();

    RPGSimpleProcess p = new RPGSimpleProcess();
    p.registerRunCompleted(this);

    Thread t = new Thread(p);
    t.start();

    return true;
}

RPGSimpleProcess
================

@Override
public void run() {
    try {
        Thread.sleep(100000);

        notifyEnd();        
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

person Federico    schedule 27.03.2013    source источник
comment
Я не думаю, что на это можно ответить без дополнительной информации; например как RPG PGM запускает JVM и как он с ней взаимодействует?   -  person Stephen C    schedule 27.03.2013


Ответы (1)


Быстрый ответ - нет.

Более длинный ответ заключается в том, что если бы у вас было бесконечное задание сервера, которое принимало запросы от отдельных клиентов, то все клиенты фактически повторно использовали бы JVM, запущенную заданием сервера.

Одним из способов создания этого задания сервера является использование очередей данных для передачи данных от клиента к заданию сервера и обратно. Запустите задание сервера, когда компьютер выполнит IPL (добавьте запись задания автозапуска в пакетную подсистему), и пусть он прослушивает очередь данных через QRCVDTAQ. Это задание запустит JVM, вызовет методы Java и вернет ответ через QSNDDTAQ. Каждый клиент будет делать то же самое, обеспечивая двустороннюю связь между сотнями отдельных заданий и одним заданием сервера.

person Buck Calabro    schedule 27.03.2013
comment
Спасибо, Бак, я действительно работал над этой точной схемой. Задание сервера представляет собой RPGLE, которая читает форму DTAQ и вызывает класс Java через процедуры, класс Java запускает поток. Но я получаю некоторую ошибку о файле и многопоточности, но я не открываю файлы. - person Federico; 05.04.2013
comment
Если я делаю то же самое, но вместо того, чтобы вызывать класс Java через процедуру, я вызываю CLP PGM и запускаю команду RUNJVA, которая запускает основной класс Java, который запускает несколько потоков, тогда код работает. Но у всех тем разные номера заданий, я запутался. - person Federico; 05.04.2013
comment
CPF4380: открытые атрибуты недействительны в многопоточном задании. Но сейчас я думаю, что это как-то связано с отладкой. Когда я работаю нормально, он не запускает поток, и я не получаю никаких сообщений. - person Federico; 05.04.2013
comment
CPF4380 перечисляет файл и библиотеку в тексте справки второго уровня. Это может дать вам представление о том, какой файл пытается открыть код. В спецификации RPG H у вас указано THREAD(*SERIALIZE) или *CONCURRENT? Или, в случае версии RUNJVA, почему важно, чтобы все потоки имели одинаковый номер задания? - person Buck Calabro; 05.04.2013
comment
В случае RUNJVA, если у них у всех разные номера заданий, это означает, что у всех у них разные JVM. Я хочу, чтобы они находились под одной и той же JVM. - person Federico; 05.04.2013
comment
Я думаю, вам нужно отредактировать свой вопрос с помощью определенного кода, чтобы мы могли видеть, что вы пытаетесь сделать. - person Buck Calabro; 05.04.2013
comment
Я только что провел тест, и все мои потоки Java находятся в одном и том же задании IBM i. Я подозреваю, что вы что-то делаете, запуская несколько заданий на стороне IBM. Используете ли вы какие-либо классы JT400? JDBC? Что-нибудь, что связывает Java и IBM i? - person Buck Calabro; 06.04.2013
comment
Просто для протокола: можно закодировать весь сценарий очереди данных на чистой Java. - person Thorbjørn Ravn Andersen; 01.03.2014