☆☆利用DPC技术简单实现JAVA与RPG混合编程☆☆
发表于:2007-06-08来源:作者:点击数:
标签:
[size=18:dd7690cae1][b:dd7690cae1]☆☆利用DPC技术简单实现JAVA与RPG混合编程☆☆[/b:dd7690cae1][/size:dd7690cae1] 【前言】 对于AS/400 数据库 程序员 来说,让他们完全抛弃RPG而转向JAVA是不现实、不理智的。这不仅仅是感情上的问题;在技术上,RPG现
[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.a
clearcase/" target="_blank" >ccess.*;
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。

|
| wildfish 回复于:2004-03-24 08:22:50
| 顶,不错
| | fyx2008 回复于:2004-03-24 09:35:45
| 强力支持。。。。。。顶。。。。
| | fzrxh 回复于:2004-03-24 13:02:06
| 好文章呀,可惜我是java盲
| | cobblestone 回复于:2004-03-24 13:03:46
| 这样用过,但AS400连接释放资源很慢,有时会出问题
| | andrewleading_he 回复于:2004-03-25 12:41:21
| 好文,收藏了!
有一個技術融合的過程,400最後還是會跟java結合的,讓我們拭目以待吧!
| | DT1 回复于:2004-03-28 16:20:53
| 能不能帮我看看这个问题啊:
[url]http://bbs.chinaunix.net/forum/10/20040328/290905.html[/url]
我就是看了你的这个文章后想用用JTOpen搞搞AS400的客户端程序
| | 好男孩 回复于:2004-03-29 13:37:58
| 谢qingzhou 兄!
| | lixinli1029 回复于:2004-03-29 14:34:53
| 我也做了一个类似的程序但是程序执行到“if(pgm.run() = = true) ”就死在这里了,是怎么回事啊?谁能帮帮我?
| | echo_huang 回复于:2004-06-07 15:27:04
| 楼主,我按您的方法也写了一个调 用远程rpg的程序,和楼上的一样,也是到了run的时候就死了,一直是运行状态。没有结果。
| | qingzhou 回复于:2004-06-07 16:06:48
| [quote:a87669c615="lixinli1029"]我也做了一个类似的程序但是程序执行到“if(pgm.run() = = true) ”就死在这里了,是怎么回事啊?谁能帮帮我?[/quote:a87669c615]
[quote:a87669c615="echo_huang"]楼主,我按您的方法也写了一个调 用远程rpg的程序,和楼上的一样,也是到了run的时候就死了,一直是运行状态。没有结果。[/quote:a87669c615]
请检查系统里面是否有需要用户回答的消息。。。
然后根据这个消息检查程序的问题。
| | echo_huang 回复于:2004-06-07 16:10:35
| 应该是没有的,调 用的是一个传入3个参数,生成一个报表的rpg程序。
| | qingzhou 回复于:2004-06-07 16:18:34
| 当程序执行到“if(pgm.run() = = true) ”时,表面上是死在那;事实上可能是系统里面是需要用户回答的信息,然后你根据这个信息来判断调用的RPG程序有没有问题等等。。。
| | qingzhou 回复于:2004-06-07 16:18:34
| 我这边只是举了个简单的例子,希望是能够得到启发,具体实践时要根据用户自身环境来进行调整测试才能通过。
| | echo_huang 回复于:2004-06-07 16:28:50
| [quote:292c5ed561="qingzhou"]当程序执行到“if(pgm.run() = = true) ”时,表面上是死在那;事实上可能是系统里面是需要用户回答的信息,然后你根据这个信息来判断调用的RPG程序有没有问题等等。。。[/quote:292c5ed561]
我如何查看系统里面是否有需用户回答的信息呢?
我在控制台查看没有任务异常啊。
用的是websphere。
| | bobofish29 回复于:2004-06-16 16:21:08
| 太好了,这是我找了很久的文章呀!QINGZHOU,不知道你还有没有这方面相关的文章,交流交流!在这谢谢啦!
|
原文转自:http://www.ltesting.net
|
|