开发简单事务批处理应用程序

您可以使用批处理作业控制器和 Enterprise JavaBeans (EJB) 数据流,命令行或 Apache ANT 工具来编写简单的批处理应用程序。

有关此任务

避免麻烦: 如果批处理步骤使用的批处理数据流 (BDS) 的数据是部署了批处理应用程序的应用程序服务器的文件系统的本地数据,那么必须遵循某些步骤以支持作业重新启动方案。 如果这类批处理应用程序部署至可在多台机器上运行的应用程序服务器,那么不能保证最初运行该批处理作业的机器接受重新启动请求。 批处理应用程序部署至集群时,如果针对这类应用程序运行的批处理作业已取消然后重新启动,那么会发生此情况。 在此方案中,部署可能会将重新启动请求发送至另一台机器上运行的应用程序服务器。 因此,如果需要基于文件的亲缘关系,那么可应用以下解决方案以支持作业重新启动方案:
  • 确保数据以相同方式提供给可启动批处理应用程序的每台机器使用。 对此示例使用网络文件系统。 此操作可能会降低应用程序的性能。
  • 在应用程序服务器上部署只能在具有本地数据的机器上运行的应用程序。 通过将该应用程序部署至只有一个成员的节点组的集群来完成此操作。
避免麻烦: 批处理应用程序开发者必须确保在批处理步骤回调方法中完成的事务性工作继承由 网格端点启动的全局事务。 此操作确保在批处理步骤下执行的工作仅在每个检查点落实并在步骤失败时回滚。

为了打印方便,这些命令被拆分为多行。

过程

  • 使用批处理作业控制器和 EJB 数据流来创建批处理作业。
    1. 创建批处理作业步骤。
      1. 创建实现 com.ibm.websphere.BatchJobStepInterface 接口的 Java™ 类。
      2. 实现业务逻辑。

        如果您的步骤有一个输入流和一个输出流,那么您可选择使用 GenericXDBatchStep 的通用批处理步骤。

    2. 创建批处理数据流。
      1. 创建用于实现接口 com.ibm.websphere.batch.BatchDataStream 的 Java 类。

        批处理数据流是通过业务逻辑访问的,例如,通过批处理作业步骤(通过带 jobID 和 stepID 调用 BatchDataStreamMgr)。 JobID 和 stepID 是使用键 BatchConstants.JOB_ID 和 BatchConstants.STEP_ID 从步骤 bean 属性列表中检索的。

      2. 将 BatchConstants.JOB_ID 映射至 com.ibm.websphere.batch.JobID,并将 BatchConstants.STEP_ID 映射至 com.ibm.websphere.batch.StepID。

        您应该已经访问了 BatchConstants 类。

        批处理数据流框架提供了一些现成的模式来处理不同类型的数据流,例如,文件和数据库。 要使用批处理数据流框架,请完成以下步骤。

        1. 标识要操作的数据流类型,例如 TextFile, ByteFile, JDBC或 z/OS® 流。
        2. 标识要从该流读取数据还是向该流写入数据。
        3. 请参阅批处理数据流框架和模式中的表。 从支持类列中选择与数据流类型和操作相匹配的类。 例如,如果要从文本文件中读取数据,请选择 TextFileReader。
        4. 实现模式名称列中列示的接口,该接口对应您在上一步中选择的支持类。 支持类会处理与该流和批处理编程模型相关的所有内务活动。 该实现类将重点放在流处理逻辑上。
        5. 在 xJCL 中声明支持类及您的实现类。
        6. 对您的步骤中所需的每个数据流重复此过程。
    3. 可选: 获取作业步骤上下文。
      JobStepContext ctx= JobStepContextMgr.getContext();
      JobStepContextMgr 服务类允许批处理作业步骤获取对其 JobStepContext 对象的引用。 该作业步骤上下文提供以下功能:
      • 对唯一标识运行当前批处理作业步骤的上下文的信息(例如,作业标识)的访问
      • 瞬态用户数据区域,在此区域中,可在批处理作业步骤生效期间在批处理编程框架方法间传递特定于应用程序的信息
      • 持久性用户数据区域,在此区域中,可在步骤间传递特定于应用程序的信息

      您可以使用 PersistentMap helper 类来简化在作业步骤上下文的持久用户数据区域中存储基本类型(例如,布尔值和双精度)的操作。

    4. 在 xJCL 中定义批处理数据流。
      <batch-data-streams>	 
         <bds> 	
      <logical-name>inputStream</logical-name>  	
      <props>  	    
           <prop name="PATTERN_IMPL_CLASS" value="MyBDSStreamImplementationClass"/>
      <prop name="file.encoding" value="8859_1"/>  
           <prop name="FILENAME" value="${inputDataStream}" />
           <prop name="PROCESS_HEADER" value="true"/>  
           <prop name="AppendJobIdToFileName" value="true"/> </props> 
      <impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.FileByteReader
      </impl-class> 
      </bds>
      PATTERN_IMPL_CLASS 类表示 BDS 框架模式的用户实现,impl-class 属性表示支持类。
    5. 可选: 启用跳过级别处理。

      使用跳过记录处理来跳过事务批处理作业中的读写记录错误。 在 xJCL 中指定跳过记录策略。 请阅读有关跳过记录处理的主题以了解进一步信息。

    6. 可选: 启用重试步骤处理。

      processJobStep 方法在事务批处理作业中遇到错误时,使用重试步骤处理来重试作业步骤。 在 xJCL 中指定重试步骤策略。 请阅读有关重试步骤处理的主题以了解进一步信息。

    7. 可选: 配置事务方式。

      使用事务方式来定义是以全局事务方式还是局部事务方式来调用作业相关工件。 请阅读有关可配置事务方式的主题以了解进一步信息。

    8. 可选: 提供作业侦听器。

      提供 com.ibm.websphere.batch.listener.JobListener 接口的实现以对作业和步骤添加其他初始化和清除。 在 xJCL 中使用作业级别侦听器元素来指定作业侦听器。

      在调用任何用户工件之前调用作业侦听器 beforeJob() 方法。 在调用最后一个用户工件之后调用作业侦听器 afterJob() 方法。 在任何步骤相关用户工件之前调用作业侦听器 beforeStep() 方法。 作业侦听器 afterStep() 方法作为最后一个步骤相关用户工件调用。 每次调用该作业侦听器时,它都会将消息记录到作业日志中。

    9. 声明批处理作业控制器。
      1. 将无状态会话 Bean 添加到部署描述符,并指向 产品 提供的实现类。 通过将 com.ibm.ws.batch.BatchJobControllerBean 指定为 bean 类来完成此任务。 仅对每个批处理应用程序执行一次此规范。
      2. 对远程 home 接口类使用 com.ibm.ws.batch.BatchJobControllerHome,对远程接口类使用 com.ibm.ws.batch.BatchJobController
    10. 配置 EJB 部署描述符。
      1. 在控制器 bean 上配置对类型为 commonj.work.WorkManager 的缺省 WorkManager wm/BatchWorkManager 的资源引用。
      避免麻烦: 必须在批处理应用程序的 Enterprise JavaBeans (EJB) 部署描述符中声明批处理控制器 Bean 的部署描述符。 只能对每个批处理应用程序定义一个控制器 bean。
  • 使用命令行创建批处理作业。
    1. 创建批处理作业步骤。
      1. 创建用于实现 com.ibm.websphere.BatchJobStepInterface 接口的 Java 类。
      2. 实现业务逻辑。

        如果您的步骤正好有一个输入和一个输出流,那么您可选择使用 GenericXDBatchStep 的通用批处理步骤。

    2. 创建批处理数据流。
      1. 创建用于实现接口 com.ibm.websphere.batch.BatchDataStream 的 Java 类。

        批处理数据流是通过业务逻辑访问的,例如,通过批处理作业步骤(通过带 jobID 和 stepID 调用 BatchDataStreamMgr)。 JobID 和 stepID 是使用键 BatchConstants.JOB_ID 和 BatchConstants.STEP_ID 从步骤 bean 属性列表中检索的。

      2. 将 BatchConstants.JOB_ID 映射至 com.ibm.websphere.batch.JobID,并将 BatchConstants.STEP_ID 映射至 com.ibm.websphere.batch.StepID。

        您应该已经访问了 BatchConstants 类。

        批处理数据流框架提供了一些现成的模式来处理不同类型的数据流,例如,文件和数据库。 要使用批处理数据流框架,请完成以下步骤。

        1. 标识要对其执行操作的数据流类型,例如,TextFile、ByteFile、JDBC 或 z/OS 流。
        2. 标识要从该流读取数据还是向该流写入数据。
        3. 请参阅批处理数据流框架和模式中的表。 从支持类列中选择与数据流类型和操作相匹配的类。 例如,如果要从文本文件中读取数据,请选择 TextFileReader。
        4. 实现模式名称列中列示的接口,该接口对应您在上一步中选择的支持类。 支持类会处理与该流和批处理编程模型相关的所有内务活动。 该实现类将重点放在流处理逻辑上。
        5. 在 xJCL 中声明支持类及您的实现类。
        6. 对您的步骤中所需的每个数据流重复此过程。
    3. 获取作业步骤上下文。
      JobStepContext ctx= JobStepContextMgr.getContext();
      JobStepContextMgr 服务类允许批处理作业步骤获取对其 JobStepContext 对象的引用。 该作业步骤上下文提供以下功能:
      • 对唯一标识运行当前批处理作业步骤的上下文的信息(例如,作业标识)的访问
      • 瞬态用户数据区域,在此区域中,可在批处理作业步骤生效期间在批处理编程框架方法间传递特定于应用程序的信息
      • 持久性用户数据区域,在此区域中,可在步骤间传递特定于应用程序的信息

      您可以使用 PersistentMap helper 类来简化在作业步骤上下文的持久用户数据区域中存储基本类型(例如,布尔值和双精度)的操作。

    4. 打开命令提示符并确保 Java 在该路径上。
    5. 在单行上发出以下命令。
      [AIX Solaris HP-UX Linux Windows][IBM i]
      java -cp ${WAS_INSTALL_ROOT}/plugins/com.ibm.ws.batch.runtime.jar 
      com.ibm.ws.batch.packager.WSBatchPackager
      	 -appname=<Application_Name>
      	 -jarfile=<jarfile containing the POJO batch steps>
      	 -earfile=<name of the output EAR file without the .ear extension>
      	 [-utilityjars=<semicolon separated list of utility jars>]
      	 [-debug]
      	 [-gridJob]
      例如,对于批处理作业,发出
      java -cp ${WAS_INSTALL_ROOT}/plugins/com.ibm.ws.batch.runtime.jar 
      com.ibm.ws.batch.packager.WSBatchPackager
      	 -appname=XDCGIVT
      	 -jarfile=XDCGIVTEJBs.jar
      	 -earfile=XDCGIVT
    6. 打包批处理应用程序。

      请使用下列其中一种方法。

      • 使用 WSBatchPackager 脚本来打包应用程序。
        [AIX Solaris HP-UX Linux Windows]
        <WASHOME>/stack_products/WCG/bin/WSBatchPackager.sh
        		 		 -appname=<application_name>
        		 		 -jarfile=<jar_file_containing_POJO_step_classes>
        		 		 -earfile=<output_ear_file_name>
        		 		 [-utilityjars=<semicolon_separated_utility_jars>]
        		 		 [-nonxadsjndiname=<non-xa_datasource_JNDI_name_for_CursorHoldableJDBCReader>;<non-XA_datasource_JNDI_name_2>;...]
        		 		 [-debug]
        例如,发出
        ./WSBatchPackager.sh -appname=XDCGIVT -jarfile=XDCGIVTEJBs.jar -earfile=XDCGIVT -utilityjars=myutility.jar -nonxadsjndiname=jdbc/ivtnonxa
        例如,发出
        ./WSBatchPackager.sh -Dfile.encoding=ISO8859-1 -appname=XDCGIVT -jarfile=XDCGIVTEJBs.jar -earfile=XDCGIVT -utilityjars=myutility.jar
         -nonxadsjndiname=jdbc/ivtnonxa
        避免麻烦: 如果不包含 -Dfile.encoding=ISO8859-1,那么会生成无效 EAR 和 Enterprise JavaBeans (EJB) Java 归档 (JAR) 描述符的代码页差异结果。
      • 使用 java 命令打包应用程序。

        打开命令提示符并确保 java 在该路径上。

  • 使用 ANT 来创建批处理作业。
    1. 创建批处理作业步骤。
      1. 创建用于实现 com.ibm.websphere.BatchJobStepInterface 接口的 Java 类。
      2. 实现业务逻辑。

        如果您的步骤正好有一个输入和一个输出流,那么您可选择使用 GenericXDBatchStep 的通用批处理步骤。

    2. 创建批处理数据流。
      1. 创建用于实现接口 com.ibm.websphere.batch.BatchDataStream 的 Java 类。

        批处理数据流是通过业务逻辑访问的,例如,通过批处理作业步骤(通过带 jobID 和 stepID 调用 BatchDataStreamMgr)。 JobID 和 stepID 是使用键 BatchConstants.JOB_ID 和 BatchConstants.STEP_ID 从步骤 bean 属性列表中检索的。

      2. 将 BatchConstants.JOB_ID 映射至 com.ibm.websphere.batch.JobID,并将 BatchConstants.STEP_ID 映射至 com.ibm.websphere.batch.StepID。

        您应该已经访问了 BatchConstants 类。

        批处理数据流框架提供了一些现成的模式来处理不同类型的数据流,例如,文件和数据库。 要使用批处理数据流框架,请完成以下步骤。

        1. 标识要对其执行操作的数据流类型,例如,TextFile、ByteFile、JDBC 或 z/OS 流。
        2. 标识要从该流读取数据还是向该流写入数据。
        3. 请参阅批处理数据流框架和模式中的表。 从支持类列中选择与数据流类型和操作相匹配的类。 例如,如果要从文本文件中读取数据,请选择 TextFileReader。
        4. 实现模式名称列中列示的接口,该接口对应您在上一步中选择的支持类。 支持类会处理与该流和批处理编程模型相关的所有内务活动。 该实现类将重点放在流处理逻辑上。
        5. 在 xJCL 中声明支持类及您的实现类。
        6. 对您的步骤中所需的每个数据流重复此过程。
    3. 获取作业步骤上下文。
      JobStepContext ctx= JobStepContextMgr.getContext();
      JobStepContextMgr 服务类允许批处理作业步骤获取对其 JobStepContext 对象的引用。 该作业步骤上下文提供以下功能:
      • 对唯一标识运行当前批处理作业步骤的上下文的信息(例如,作业标识)的访问
      • 瞬态用户数据区域,在此区域中,可在批处理作业步骤生效期间在批处理编程框架方法间传递特定于应用程序的信息
      • 持久性用户数据区域,在此区域中,可在步骤间传递特定于应用程序的信息

      您可以使用 PersistentMap helper 类来简化在作业步骤上下文的持久用户数据区域中存储基本类型(例如,布尔值和双精度)的操作。

    4. 对于批处理作业,请确保 com.ibm.ws.batch.runtime.jar 文件位于类路径中。
    5. 声明该任务。
      使用以下命令来声明该任务:
      <taskdef name="pgcpackager" classname="com.ibm.ws.batch.packager.PGCPackager"
      		classpath="${WAS_INSTALL_ROOT}/plugins/com.ibm.ws.batch.runtime.jar" />
    6. 在应用程序中编译 Java 文件后,调用 pgcpackager 任务。
      <pgcpackager appname="<appname>" earFile="<location name of EAR file to generate>" 
      jarfile="location of the POJO jar file"/>	

结果

您已使用批处理作业控制器和 Enterprise JavaBeans (EJB) 数据流、命令行或 ANT 工具开发简单的事务批处理应用程序。

下一步做什么?

安装计算密集型应用程序并配置 WebSphere® 网格端点。