我就在这里
分类: 其他UNIX
2014-06-16 19:45:31
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 可以从 上下载。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 提供了很多工具和类库,用于访问和控制系统资源,最常用的工具之一就是”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 也提供了很多接口,用于获得系统运行的信息。一个常用的类是 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 类用于表示 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 类的基本用法,我们首先增加一个筛选规则,选出所有用户名为”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 类可以用来获得系统中一个作业的日志。这个类通过 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 都能够成为我们的得力助手,提高我们软件开发的效率。