1

我有一个调用 Java 类的 RPG PGM,如果 Job 中没有 JVM,则 RPG 运行时会在调用 Java 类时添加一个。此后,来自同一 RPG 程序或同一 Job 中的另一个 RPG 程序的所有调用都使用相同的 JVM。

问题是,如果我从另一个 Job 启动相同的 PRG 程序,它会启动另一个 JVM,基本上我有一个用于 Job 的 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());
    }
}
4

1 回答 1

7

快速回答是否定的。

更长的答案是,如果您有一个永无止境的服务器作业正在运行,它接受来自各个客户端的请求,那么所有客户端实际上都会重用由服务器作业启动的 JVM。

创建此服务器作业的一种方法是使用数据队列将数据从客户端传递到服务器作业,然后返回。当机器 IPL 时启动服务器作业(将自动启动作业条目添加到批处理子系统)并让它通过QRCVDTAQ侦听数据队列。该作业将启动 JVM,调用 Java 方法并通过QSNDDTAQ返回答案。每个客户端都会做同样的事情,在数百个单独的作业和单个服务器作业之间进行双向通信。

于 2013-03-27T14:19:05.393 回答