【发布时间】:2018-02-01 21:10:17
【问题描述】:
我需要在 z/OS 大型机上运行 Java 类程序作为 JCL 作业步骤。有人做过吗?我已经尝试在大型机的 AIX 下运行 java 程序。但我需要在 JCL 作业流中运行相同的程序。我知道我可以使用 System.exit(rc) 将返回代码传递回 JCL 步骤。但是如何执行、设置 CLASSPATH、输入参数和文件以及将文件写入 z/OS?
【问题讨论】:
-
JZOS 可用吗?
我需要在 z/OS 大型机上运行 Java 类程序作为 JCL 作业步骤。有人做过吗?我已经尝试在大型机的 AIX 下运行 java 程序。但我需要在 JCL 作业流中运行相同的程序。我知道我可以使用 System.exit(rc) 将返回代码传递回 JCL 步骤。但是如何执行、设置 CLASSPATH、输入参数和文件以及将文件写入 z/OS?
【问题讨论】:
您当然可以使用 BPXBATCH 来运行一个 shell 脚本,该脚本设置您需要的任何变量,然后调用 Java。对于简单和静态的事情,您可以通过 JCL 中的特殊 DDNAME 向 BPXBATCH 传递环境变量列表。如果您需要更复杂的处理,您可能会编写一个简短的 shell 脚本来设置您需要的任何内容,这可能包括将参数从 JCL 定义的文件复制到可以传递给 Java 应用程序的本地 UNIX 服务文件。
如果您调用 Java 的脚本相当薄,您可能更喜欢 BPXBATSL - 它会在本地生成并为您节省一些资源。您可以在here 阅读有关它们的信息。
小心输出文件之类的东西 - 当您运行可能分叉其他进程的 UNIX 应用程序时,使用“SYSOUT=*”之类的东西效果不佳...最好将输出重定向到本地 UNIX 文件在上面提到的 IBM 文档的这个例子中:BPXBATCH SH /u/usr/joe/shellscriptA > /tmp/a.out。如果您需要打印此输出(或其他),您始终可以使用 OGET 进行后续步骤 - 请参阅 here。
如果您做了很多这样的工作,并且想要获得最后一点的性能,您可以随时为自己编写一个小型 C 程序来为您处理所有这些步骤。您将设置所需的任何环境变量等,然后生成 Java 进程并等待它结束。如果您想要更复杂,您甚至可以通过设置一些管道并将它们作为 STDOUT/STDERR 传递给 Java 来直接写入 SYSOUT。
【讨论】:
这是一个示例,它将运行一个非常简单的 Java 程序 (myapp),该程序位于 /u/tstradm/myapp 中并将输出写入 /u/tstradm/myapp。
//TSTRADMB JOB MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID,REGION=0M
//EXPORT EXPORT SYMLIST=*
// SET APPROOT='/u/tstradm/myapp'
//RUNJAVA EXEC PGM=BPXBATSL,REGION=0M,TIME=NOLIMIT,
// PARM='SH java -cp &APPROOT myapp'
//STDOUT DD PATH='&APPROOT/myapp.out',
// PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
// PATHMODE=SIRWXU
//STDERR DD PATH='&APPROOT/myapp.err',
// PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
// PATHMODE=SIRWXU
请注意,我在类所在的根目录中使用了一个名为 APPROOT 的 JCL 符号,然后在 java 调用上设置我的类路径时将其用于替换。
我不会在 JCL 中做太太复杂的事情 - 这是一种烦人的语言,对事情的长度有限制,但它可以让你在 shell 中运行程序并重定向输出到 HFS。
【讨论】: