概述

IBM Toolbox for Java 是一个类的集合,用于开发与 IBM i 相关的 Java 应用程序。它包含的各类工具,提供了对于 IFS、IBM i 系统信息、客户端 / 服务器等各类应用场景的的支持,用户可以在其他平台诸如 Windows,Linux 上面方便的使用 IBM Toolbox for Java 开发运行在 IBM i 上的应用程序,为用户的编程和调试带来了极大的方便。我们在这些操作系统平台上,通过几行简单的代码就可以访问一台 IBM i 系统,对系统进行相应的控制和更改。

IBM Toolbox for Java 不仅可以供 IBM 的开发人员使用,它还拥有一个开源版本 JTOpen,供所有人员下载和使用。JTOpen 可以从 SourceForge 网站上下载。JTOpen 的下载和使用遵循 IBM 公共许可证协议(IBM Public License),这个协议鼓励使用者对软件进行开发和改进,同时鼓励软件的商业化应用。

本文将通过一些例子,来介绍如何使用 IBM Toolbox for Java 提供的各种工具来访问 IBM i 系统并且开发 IBM i 相关的 Java 程序。

回页首

初始化并建立连接 :

IBM Toolbox for Java 中的 AS400 类用于建立访问 IBM i 系统的连接,这个类的使用很简单,只需使用如下参数初始化 AS400 类,Toolbox 就会自动建立连接并用相应的用户名登录制定的系统:

清单 1. 使用 Toolbox 建立连接
		 AS400 as400 = new AS400(SystemName, Username, Password);

如果不在初始化 AS400 对象的时候指定用户,Toolbox 在连接的时候就会弹出一个窗口,提示输入登录 IBM i 的用户名和密码。

我们也可以指定默认的登录用户,在登录框中选择”Default User”和”Save Password”,这样在下次再次登录的时候,可以免输用户名或密码,代码如下:

清单 2. 指定默认的登录用户
	 AS400 sys1 = new AS400(SystemName);
	 AS400 sys2 = new AS400(SystemName);
	 try{
		 sys1.connectService(AS400.COMMAND);
		 sys2.connectService(AS400.COMMAND);
	 }catch(Exception e) {
		 e.printStackTrace();
	 }

如果我们需要访问一台 IBM i 系统上的敏感数据,或者访问或存储的数据内容需要加密,我们可以使用 Toolbox for Java 中的 SecureAS400 类。这个类继承了 AS400 类,使用方法与 AS400 类似,连接时只需输入系统名、用户名和密码即可。但是 SecureAS400 中使用了 Secure Sockets Layer(SSL),因此在数据交换时更加安全可靠。

除了直接新建一个连接之外,我们还可以使用连接池来获得一个对 AS400 的连接。参见下面的代码:

清单 3. 使用连接池来获得连接
	 AS400ConnectionPool as400Pool = new AS400ConnectionPool();
	 as400Pool.setMaxConnections(128);
	 as400Pool.fill(SystemName, Username, Password, AS400.DATABASE, 50);
	 as400Pool.getConnection(SystemName, Username, Password, AS400.COMMAND);

上面的代码新建了一个 as400Pool 作为一个连接 IBM i 系统的连接池,设置最大连接数为 128,同时为服务器建立 50 个连接。在建立完连接之后,从连接池中获得一个连接,使用用户名和密码。

使用连接池的优点在于,当所需要建立的连接数很多的时候,使用连接池可以大大提高效率,减少建立连接所需要的时间。当连接数少的时候,这种效果不明显,但当连接数多的时候,使用连接池对系统效率的提升效果会很明显。

除了 AS400 之外,另外一个有用的类是 AS400JPing。这个类可以可以用来 Ping 一个 IBM i 系统,从而查询这个系统当前是否在活动状态,或者查询系统的某个端口是否可用。下面的代码演示了这个类的使用方法:

清单 4.AS400JPing 的使用
	 AS400JPing pingObj = new AS400JPing(SystemName, AS400.COMMAND, false);
	 if(pingObj.ping())
		 System.out.println("SUCCESS");
	 else
		 System.out.println("FAILED");

回页首

使用 IBM Toolbox for Java 获取 IBM i 系统信息:

IBM Toolbox for Java 提供了很多工具和类库,用于访问和控制系统资源,最常用的工具之一就是”com.ibm.as400.access”包中的 AS400 类。AS400 通过 socket 连接来登录和访问一个 IBM i 系统,一旦登录成功,它会以方法的形式提供各种各样的接口供用户访问 IBM i 系统的各种信息。例如,如果想获得一个 IBM i 系统的系统名、操作系统版本、当前登录用户和使用的 CCSID,我们可以使用以下代码实现:

清单 5. 获取 IBM i 系统信息
	 AS400 as400 = new AS400(SystemName, Username, Password);
	 System.out.println(as400.getSystemName());
	 System.out.println(as400.getVRM());
	 System.out.println(as400.getUserId());
	 System.out.println(as400.getCcsid());

回页首

使用 IBM Toolbox for Java 获取系统运行信息:

IBM Toolbox for Java 也提供了很多接口,用于获得系统运行的信息。一个常用的类是 SystemStatus。这个类允许我们访问一台 IBM i 系统,并且获得当前作业的运行状况和各种信息。

举例来说,如果我们想知道当前系统中有多少批处理作业正在运行,可以使用以下方法:

清单 6. 获取系统运行信息
	 AS400 as400 = new AS400(SystemName, Username, Password);
	 SystemStatus systemStatus = newSystemStatus(as400);
	 try{
		 System.out.println("getBatchJobsRunning: "
					 + systemStatus.getBatchJobsRunning());
	 } catch(Exception e) {
		 e.printStackTrace();
	 }

方法 getBatchJobsRunning() 用于返回当前正在运行的批处理作业数量。与此相关的方法还有很多,下表列出了 SystemStatus 类中常用的用于显示系统运行状况的方法及它们的作用:

方法用途
ASPUsed显示当前系统 ASP 的使用状况
getJobsInSystem获得系统中的作业总数
getBatchJobsEnding获得正在结束的作业数量
getBatchJobsWaitingToRunOrAlreadyScheduled获得等待运行的作业数量
getPoolsNumber获得系统中 Pool 的数量
getSystemPools返回 Enumeration 类型,枚举系统中的 Pool,枚举类型为 SystemPool
getPercentProcessingUnitUsed返回处理器使用的百分比
getUsersCurrentSignedOn获得当前已经登录的用户数
getTotalAuxiliaryStorage获得存储的总容量
getDateAndTimeStatusGathered获得系统当前的日期时间,储存在一个 Date 对象中

除了 SystemStatus 之外,Toolbox for Java 还提供了很多与作业相关的类用来管理和获得系统中作业的信息,这些类包括 Job 类、JobList 类、JobLog 类、JobCCSID 类等等。下面我们会对其中常用的几个作业相关类进行一下介绍。

回页首

Job 类:

Job 类用于表示 IBM i 系统上的一个作业,它的定义中包含了作业所需要的各种参数和信息,我们可以利用 Job 类提供的各种方法,对作业进行查询、管理,信息收集

下面的例子演示了如果使用 Job 类的一个对象来获得 IBM i 系统上一个作业的各种常用信息。在使用 Job 类之前,我们需要先用连接名、作业名、用户名和作业号初始化一个 Job 类的对象,这样系统才能利用这些信息找到正确的作业。当定位到作业以后,我们用 loadInformation 函数载入此时这个作业的各类信息。需要注意的是,loadInformation 只对作业信息进行一次更新,所以如果作业的运行参数在一段时间后发生了改变,需要再次调用这个函数来及时更新对象中储存的信息。更新完对象中的信息,我们就可以调用 Job 类提供的各种方法获得我们所需要的作业信息了。代码如下:

清单 7.Job 类的使用
	 AS400 as400 = new AS400(SystemName, Username, Password);
	 try{
		 // 初始化一个 Job 类对象的时候,指定它的系统名、作业名、用户名和作业编号
		 Job job = new Job(as400, jobName, userName, jobNumber);

		 // 调入此作业当前的信息
		 job.loadInformation();

		 // 获得作业的状态
		 System.out.println(job.getStatus());

		 // 获得作业第一个线程的当前 library
		 System.out.println(job.getCurrentLibrary());

		 // 获得作业使用的 CPU 时间
		 System.out.println(job.getCPUUsed());

		 // 获得执行方法名
		 System.out.println(job.getFunctionName());

		 // 获得作业开始运行的日期和时间
		 System.out.println(job.getJobActiveDate());

		 // 获得作业描述
		 System.out.println(job.getJobDescription());

		 // 获得作业的日志等级
		 System.out.println(job.getLoggingLevel());

		 // 获得作业关联的语言描述符
		 System.out.println(job.getLanguageID());

		 // 返回作业名
		 System.out.println(job.getName());

		 // 返回作业号
		 System.out.println(job.getNumber());

		 // 获得作业队列的 IFS 路径
		 System.out.println(job.getQueue());

		 // 获得作业的子系统
		 System.out.println(job.getSubsystem());

		 // 获得作业的用户名
		 System.out.println(job.getUser());
	 } catch(Exception e) {
		 e.printStackTrace();
	 }

除了获得作业参数和信息的功能外,Job 类还提供了很多方法用于对 IBM i 系统上一个作业进行控制、修改和管理。下面的代码演示了这些功能:

清单 8. 使用 Job 类对作业进行控制、修改和管理
	 AS400 as400 = new AS400(SystemName, Username, Password);
	 try{
		 // 初始化一个 Job 类对象的时候,指定它的系统名、作业名、用户名和作业编号
		 Job job = new Job(as400, jobName, userName, jobNumber);

		 // 使用缓存,对作业做出的修改保存在缓存中,直到 commit 的时候才生效
		 job.setCacheChanges(true);

		 // 更改优先级
		 job.setRunPriority(66);

		 // 更改日期格式
		 job.setDateFormat("*YMD");

		 // 提交修改
		 job.commitChanges();

		 // 直接修改作业信息,不使用缓存
		 job.setCacheChanges(false);

		 // 更改日志等级
		 job.setLoggingLevel(4);

		 // 暂停作业
		 job.hold(true);

		 // 继续运行作业
		 job.release();

		 // 结束作业,参数表示结束这个作业的等待时间
		 job.end(10);
	 } catch (Exception e) {
		 e.printStackTrace();
	 }

上面的代码更改了一个正在运行的作业的优先级、日期格式、日志等级等参数。从代码中还可以看出,利用 Job 类管理 IBM i 系统上的作业有两种方式。一种方式是直接调用函数对作业进行控制,此时调用函数做出的修改可以立即生效。另一种方式是设立一个缓存,把对作业的修改先保存在缓存当中,等到需要提交修改的时候再提交出去,使修改生效。

需要注意的是,不是所有的与作业相关的参数都可以通过这种方式改变,例如作业名、作业编号、用户名。虽然 Job 类提供了修改这几个参数的方法,但是这些方法并不会真正修改 IBM i 系统上一个作业的名字、作业号和用户,而只是修改这个 Job 类的对象中储存的数据,而 IBM i 服务器上运行的实际的作业仍然使用以前的名字、号码和用户。参见下面的例子:

清单 9. 使用 Job 类修改参数
	 AS400 as400 = new AS400(SystemName, Username, Password);
	 Job job = new Job(as400, "J9632#AGNT", "XJ9", "352076");

	 // 更改作业的名字、作业号和用户名
	 job.setName("NEWNAME");
	 job.setNumber("123456");
	 job.setUser("testuser");

	 System.out.println(job.getName());
	 System.out.println(job.getNumber());
	 System.out.println(job.getUser());

在执行完这些代码后,虽然程序输出的名字、号码和用户名会变成我们刚刚更改的,但是服务器上的作业仍然使用更改前的名字、作业号和用户。

回页首

JobList 类:

JobList 类用来获得一个系统中的作业,返回一个作业列表。在生成列表的时候,我们可以添加作业的筛选规则,用户可以选择获得所有作业,或者符合条件的作业。

下面的代码演示了 JobList 类的基本用法,我们首先增加一个筛选规则,选出所有用户名为”testuser”的作业,并返回一个作业列表。然后,使用 getJobs 方法获得系统中当前所有符合要求的作业,并打印出每个作业的名称和作业号。

清单 10.JobList 类的使用
	 AS400 as400 = new AS400new AS400(SystemName, Username, Password);
	 String Jobuser = "testuser";

	 try{
		 JobList jobList = new JobList(as400);

		 // 加入筛选条件,获取符合要求的作业信息
		 jobList.addJobSelectionCriteria(JobList.SELECTION_USER_NAME,Jobuser);
		 Enumeration list = jobList.getJobs();
		 while(list.hasMoreElements()) {
			 Job job = (Job) list.nextElement();
			 System.out.println(job.getName() + " " +
			           job.getNumber());
		 }
		 System.out.println("Total: " + jobList.getLength());
	 } catch(Exception e) {
		 e.printStackTrace();
	 }

回页首

JobLog 类:

JobLog 类可以用来获得系统中一个作业的日志。这个类通过 message 的形式,获得作业日志中的内容,并返回给用户。它同时也提供了方法,使得用户可以向一个作业的日志中写入内容(writeMessage)。以下的代码演示如何使用 JobLog 类获得一个作业的日志:

清单 11.JobLog 类的使用
	  AS400 as400 = new AS400(SystemName, Username, Password);
	 try{
		 // 初始化 JobLog 对象并获得消息列表
		 JobLog jlog = newJobLog(as400, jobName, userName, jobNumber);
		 Enumeration messageList = jlog.getMessages();

		 while(messageList.hasMoreElements()) {
			 AS400Message message =
						 (AS400Message) messageList.nextElement();
			 System.out.println(message.getText());
		 }
	 } catch(Exception e) {
		 e.printStackTrace();
	 }

回页首

结束语

本文讲述了使用 IBM Toolbox for Java 在 IBM i 系统上开发 Java 应用程序的方法。使用 IBM Toolbox for Java 可以方便的访问一台 IBM i 系统,获得它的各类信息及它上面作业的信息,从而实现在外部对 IBM i 系统的控制。但是 IBM Toolbox for Java 的功能远远不止这些,除了访问本文所叙述的系统资源外,它还提供了各种各样的工具和类供我们应用。例如:访问数据库资源 JDBC 的接口,进行数据编码转换的工具类,在其他平台对 IBM i 的 IFS 文件系统进行文件操作的类,HTML 相关类等等。这些工具极大的方便了我们的应用程序开发,使我们可以很容易的编写 Java 程序对一台 IBM i 系统进行控制和管理。无论是在 IBM i 上的普通 Java 程序,还是 web 应用程序,相信 IBM Toolbox for Java 都能够成为我们的得力助手,提高我们软件开发的效率。


09-19 00:56