[size=18:dd7690cae1][b:dd7690cae1]☆☆利用DPC技术简单实现JAVA与RPG混合编程☆☆[/b:dd7690cae1][/size:dd7690cae1]
【前言】
对于AS/400数据库程序员来说,让他们完全抛弃RPG而转向JAVA是不现实、不理智的。这不仅仅是感情上的问题;在技术上,RPG现在仍然是AS/400操作数据库性能最好的语言。迄今为止,IBM也从未在任何资料中宣称JAVA的数据库性能可以全面取代RPG。但不可否认的是,从语言本身来说,RPG的设计理念、编程方式无疑是落后了,而且过于专业化,在某种程度上,不利于一个操作系统平台的推广。
而JAVA则是一个“大众化”的编程语言,有着现代编程的全部特征和平易近人的面孔。
作为IBM力推的工具,在性能上,JAVA不会在RPG后面落后很久。除了数据库领域,IBM为JAVA提供了很多AS/400的系统接口,我们甚至可以用JAVA编写系统应用。面对现有的大量RPG程序,我们可以采取JAVA与之相结合的方式,改变传统“CL做主控程序,RPG做子程序”的做法,让JAVA负责系统方面的控制,如登录、用户界面,RPG程序专门负责处理数据,各取所长,给最终用户提供更友好的界面、更简单的操作。
【实现技术】
现在介绍如何利用分布式程序调用(Distributed Program Call,缩写为DPC)的技术,可以以简单的方式很好地实现JAVA和RPG混合编程。
DPC是AS/400 Toolbox提供的一个接口,通过它我们可以在JAVA程序中调用一个以其它语言编写的程序(如RPG、CL、COBOL)去完成某项工作。一般JAVA程序放在客户机上,以远程方式去调用AS/400上的某个RPG程序去处理数据库,如下图:
【应用事例】
下面我们假定AS/400上已经存在了一个RPG程序,位于TEST库下,程序名为PGMCALL,这个程序处理某个PF,输入客户编号,返回客户姓名。
在这里主要是介绍DPC接口,至于这个RPG程序的具体实现,在这里不作赘述。
我们假定这个RPG有2个入口参数:
参数名 类型 描述
NUMBER Pack(3,0) 客户编号,仅用于输入
NAME Character(30) 客户姓名,仅用于输出
1、建立一个类:TestDPC,其定义如下:
[code:1:dd7690cae1]
import java.io.*;
import java.math.*;
import com.ibm.as400.access.*;
public class TestDPC{
private AS400 as400;
private ProgramCall pgm;
private String progname = "/qsys.lib/test.lib/pgmcall.pgm";}
[/code:1:dd7690cae1]
2、添加TestDPC的connectDPC()
[code:1:dd7690cae1]
public void connectDPC(String system,String user,String password){
as400=new AS400(system,user,password);
try
{ //连接相关的Server程序
as400.connectService(AS400.COMMAND);
}
catch(Exception e)
{ System.out.println("连接AS/400服务失败!");
System.exit(0);
}
//建立远程程序对象
pgm=new ProgramCall(as400);
//设置参数,并转换为AS/400格式
ProgramParameter[]parmlist = new ProgramParameter[2];
AS400PackedDecimal number = new AS400PackedDecimal(3,0);
parmlist[0] = new ProgramParameter(number.toBytes(new BigDecimal(222)),3);
AS400Text name = new AS400Text(30);
parmlist[1] = new ProgramParameter(name.toBytes(""),30);
try
{ //将程序路径、参数表与ProgramCall对象捆绑
pgm.setProgram(progname,parmlist);
}
catch(Exception e)
{ System.out.println("设置参数失败!");
}
try
{ if(pgm.run() = = true)
{ System.out.println(name.toObject(parmlist[0].getOutputData()));
System.out.println(number.toObject(parmlist[1].getOutputData()));
System.out.println("远程调用成功!");
}
else
{ System.out.println("远程调用失败!");
}
}
catch(Exception e)
{
System.out.println("远程调用异常!");
e.printStackTrace();
}
}
[/code:1:dd7690cae1]
【要点说明】
使用DPC技术最关键的地方是参数要在AS/400和JAVA两种格式之间转换,这里我着重对涉及参数的几个方法介绍。
(1)ProgramParameter[]parmlist = new ProgramParameter[2];
说明:建立参数数组,数组元素个数即参数的个数。
(2)AS400PackedDecimal number = new AS400PackedDecimal(3,0);
parmlist[0] = new ProgramParameter(number.toBytes(new BigDecimal(222)),3);
AS400Text name = new AS400Text(30);
parmlist[1] = new ProgramParameter(name.toBytes(""),30);
说明:设置两个参数,并转换为AS/400格式。注意ProgramParameter的构造函数有三种方式:
public ProgramParameter(byte data[])——该参数只用于输入,以字节流方式传送。
public ProgramParameter(int size)——该参数只用于输出,指定输出字节大小。
public ProgramParameter(byte data[],int size)——该参数输入输出均可。
例中用toBytes()方法将JAVA对象转换为字节流。
(3)pgm.run()
说明:执行远程程序,如果远程程序正常运行返回true,否则返回false。
(4)name.toObject(parmlist[0].getOutputData())
说明:取得返回值并从AS/400格式转换为JAVA的Object。
![]() | |||||||||||||||||||||||||||||||||
|