• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

☆☆利用DPC技术简单实现JAVA与RPG混合编程☆☆

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 19次 | 进入软件测试论坛讨论

领测软件测试网
[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。






 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,不知道你还有没有这方面相关的文章,交流交流!在这谢谢啦!

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网