- 论坛徽章:
- 0
|
本帖最后由 double_life 于 2012-09-01 21:22 编辑
作为一种面向对象的Java编程模型,IBM Java Toolbox for i为Java应用程序访问IBM i数据与资源提供了API级的通信支持。该Java应用程序既可以运行在IBM i环境,也可以运行在非IBM i环境,比如Windows,AIX,Linux,Solaris等。从这个角度看,IBM Java Toolbox for i的工作方式有两种,一种是基于客户端的远程通信,另一种是基于服务器端的本地通信。我们重点放在服务器端应用程序的探讨,因为对于这种应用程序而言,他们可以选用的Java编程模型分为两种,一种为IBM Java Toolbox for i,另一种为Java API本身。在不同的应用场景中如何做出选择,这是本文关注的重点。
一般性考虑因素
当我们需要在IBM Java Toolbox for i与Java API两者间做出选择时,我们应该考虑的因素如下:
1. 工作方位 – 指的是应用程序的工作模式。具体而言,要做好抉择,需要回答以下问题:
• 是否仅仅运行在客户端
• 是否仅仅运行在IBM i服务器端
• 是否兼而有之
如果是第一种或者第三种,则推荐选择IBM Java Toolbox for i。对于第二种,建议尽量采用一些Native的方法。
2. 一致性/可移植性 – 这条原则主要针对对客户端与服务器端兼而有之的应用程序。IBM Java Toolbox for i采取的是统一的对外接口,不同的对内实现类的设计模式。只需要维护一套代码就可以实现应用程序的跨平台。
3. 复杂性 – 针对服务器端的应用,为提高效率,IBM Java Toolbox for i封装了基于JNI的调用。如果把JNI的调用细节暴露给Java客户端程序,则会增加程序设计的复杂性。
4. 功能 - IBM Java Toolbox for i提供了一些比Java 原生态方法更强大的类,提供针对IBM i的特定支持。其中一个典型的例子是IFS框架。该框架可被看作是Java IO框架的扩展,但是功能会更强大。比如,IBM Java Toolbox for I 提供的IFSFileOutputStream类在功能上比Java类中的FileOutputStream更强大。
5. 资源 – 从资源的角度,推荐使用Java 类。因为IBM Java Toolbox for i的Host Server通信机制就决定了这一点。对于客户端请求,IBM Java Toolbox for i首先需要与Host Server建立通信,启动一个作业。其次才是服务器端启动一个作业来服务于对应的客户端请求。而JNI的方式则绕过了Host Server,只需启用一个服务器端作业。
6. IBM i也作为客户端 – 指的是一台IBM i 系统利用IBM Java Toolbox for i 与另一台IBM i 系统通信,此时托管应用程序的IBM i 系统可以被看作是客户端。这种方式推荐使用IBM Java Toolbox for i。比如不同IBM i 系统进程通信的一个非常重要的数据载体是Data Queue。IBM Java Toolbox for i提供了对Data Queue的API级支持。
特殊性考虑因素
除上述一些因素之外,针对具体的服务器端应用,还应具体情况具体分析。下面我们针对具体服务所做的分析如下:
对于执行CL命令,我们可以选取的方式包括:
• IBM Java Toolbox for i的CommandCall类
• java.lang.Runtime.exec方法
相比于IBM Java Toolbox for i的CommandCall方式,java.lang.Runtime.exec的优点是跨平台。但是,缺点是无法返回执行CL命令之后对应的系统消息。而这些系统消息对于诊断CL命令的错误至关重要。
对于IFS文件系统的相关操作,我们可以选取的方式包括:
• IBM Java Toolbox for i的IFSFile相关类
• java.io包的相关文件类
同样地,相比于IBM Java Toolbox for i,Java具有跨平台的优点。在功能上,相比于java.io的文件相关类,IBM Java Toolbox for i的IFS相关类功能更加丰富。
对于JDBC的相关操作,我们可以选取的方式包括:
• IBM Toolbox for Java JDBC driver
• IBM Developer Kit for Java JDBC driver
IBM Toolbox for Java JDBC driver适用于基于Client/Server工作方式的Java应用程序。如果是服务器端应用,则推荐IBM Developer Kit for Java JDBC driver,这样可以获取最好的性能。
对于IBM i程序调用的相关操作,我们可以选取的方式包括:
• IBM Java Toolbox for i的ProgramCall类
• Java Native Interface (JNI) 调用
对于服务器端应用,推荐JNI方式的本地调用,以获取最好的性能。
IBM Java Toolbox for i提供的工具类
IBM Java Toolbox for i提供Trace 对象允许 Java 程序记录跟踪点和诊断信息。此信息帮助再现和诊断问题。
Trace 类记录下列类别的信息:
转换 记录 Unicode 和本机代码页之间的字符集转换。应该只有IBM Java Toolbox for i类才使用此类别。
信息 跟踪程序的整个流程。
警告 记录关于程序能够从中恢复的错误的信息。
错误 记录导致异常的附加错误。
诊断 记录状态信息。
数据流 记录在 IBM i 和 Java 程序之间流动的数据。应该只有IBM Java Toolbox for i 类才使用此类别。
PCML 记录在 IBM i 和 Java 程序之间流动的基于PCML的数据
代理 IBM Java Toolbox for i类使用此类别来记录客户机和代理服务器之间的数据流。
全部 此类别用来同时启用或禁用所有以上类别的跟踪。不能将跟踪信息直接记录到此类别。
IBM Java Toolbox for i 类也使用跟踪类别。当 Java 程序启用记录后,IBM Java Toolbox for i 信息就与应用程序记录的信息包括在一起。
您既可以对单个类别启动跟踪,也可以对一组类别启用跟踪。在选择类别之后,使用 setTraceOn 方法来打开或关闭跟踪。 使用 log 方法来将数据写至记录。
过多的记录会影响性能。使用 isTraceOn 方法来查询跟踪的当前状态。Java 程序可以使用此方法来确定它是否应该在调用 log 方法之前构建跟踪记录。在记录关闭时调用 log 方法虽然不是错误,但要花更多时间。
缺省操作是将记录信息写至标准输出。要将记录重定向至文件, 请从 Java 应用程序中调用 setFileName() 方法。通常,因为大多数浏览器不允许 applet 写入本地文件系统,所以这只适用于 Java 应用程序。
缺省情况下,记录是关闭的。Java 程序应该为用户提供打开记录的方法,以便容易启用记录。例如,应用程序可以对命令行参数作语法分析,在参数中指示了应该记录哪一类数据。当需要记录信息时,用户可设置此参数。
以下示例显示如何使用 Trace 类。
清单 1:以下是如何使用 setTraceOn 方法,以及如何使用 log 方法将数据写至记录的示例。
// Enable diagnostic, information, and warning logging.
Trace.setTraceDiagnosticOn(true);
Trace.setTraceInformationOn(true);
Trace.setTraceWarningOn(true);
// Turn tracing on.
Trace.setTraceOn(true);
// ... At this point in the Java program, write to the log.
Trace.log(Trace.INFORMATION, "Just entered class xxx, method xxx");
// Turning tracing off.
Trace.setTraceOn(false);
清单 2:下列示例显示如何使用跟踪。对于编写使用跟踪的代码,方法 2 是更为可取的方法。
// Method 1 - build a trace record then call the log method and let the trace class determine if the data should be logged. This will work but will be slower than the //following code.
String traceData = new String("Just entered class xxx, data = ");
traceData = traceData + data + "state = " + state;
Trace.log(Trace.INFORMATION, traceData);
// Method 2 - check the log status before building the information to log. This is faster when tracing is not active.
if (Trace.isTraceOn() && Trace.isTraceInformationOn())
{
String traceData = new String("just entered class xxx, data = ");
traceData = traceData + data + "state = " + state;
Trace.log(Trace.INFORMATION, traceData);
}
清单 3:下列示例显示如何使用跟踪并重定向到文件。
// Create a component string. It is more efficient to create an object than many String literals.
String myComponent1 = "com.myCompany.xyzComponent";
String myComponent2 = "com.myCompany.abcComponent";
// Send IBM Toolbox for Java and the component trace data each to separate files.
// The trace will contain all trace information, while each component log file will only contain trace information specific to that component. If a Trace file is not specified, all trace data will go to standard out with the component specified in front of each trace message.
Trace.setTraceOn(true); // Turn trace on.
Trace.setTraceInformationOn(true); // Enable information messages.
// Log component specific trace data or general IBM Toolbox for Java trace data.
Trace.setFileName("c:\\bit.bucket");
Trace.setFileName(myComponent1, "c:\\Component1.log");
|
|