2013-03-27 3 views
1

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

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

Я хочу знать, возможно ли иметь только одну 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()); 
    } 
} 
+1

Я не думаю, что это ответственно без дополнительной информации; например как «RPG PGM» запускает JVM и как он общается с ним? –

ответ

7

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

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

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

+0

Спасибо, Бак, я действительно работал над этой точной схемой. Задача сервера - это RPGLE, которая читает форму DTAQ и вызывает процедуры Java Class, хотя процедуры Java запускают поток. Но я получаю некоторую ошибку в отношении файла и нескольких потоков, но я не открываю никаких файлов. – Federico

+0

Если я делаю то же самое, но вместо вызова класса Java по процедуре я вызываю PGM CLP и запускаю команду RUNJVA, которая запускает основной класс Java, который запускает несколько потоков, тогда код работает. Но у «нитей» есть все разные номера работы, я потерян. – Federico

+0

Какая ошибка вы получаете? –