设置多服务器环境以使用IBM WebSphere Liberty Java Batch处理批处理作业

本文详细介绍了如何在IBM WebSphere Liberty中搭建符合Java EE 7 JSR-352标准的多服务器批处理环境。通过配置JMS消息引擎、调度程序和执行程序服务器,以及使用Apache Derby数据库,实现了批处理作业的负载均衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IBM®WebSphere®Liberty V8.5.5.6支持Java批处理的开放标准JSR-352。 Liberty中的IBM实现支持核心批处理模型,并扩展了该模型以允许在单个批处理环境中使用多个服务器。 可以将批处理环境设置为使服务器充当批处理调度程序,而其他服务器充当批处理执行程序。

本教程向您展示如何在IBM WebSphere Liberty中设置和配置负载平衡多服务器环境来处理批处理作业。 它描述了如何实现WebSphere Liberty Batch白皮书中描述的“更多功能”拓扑(请参阅参考资料 )。

必备技能

在开始本教程之前,您需要具备以下领域的技能:

  • Java基本开发经验
  • JSR-352的中级知识和批处理模型
  • Apache®Derby数据库和JMS嵌入式消息传递的基础知识

关于环境

在本教程中,您将创建一个包含批处理调度程序服务器和两个执行程序服务器的环境。 一个执行程序仅处理BatchExecutor1Job请求,其他执行程序处理BatchExecutor2Job请求。 该环境由四个单独的Liberty服务器组成,如图1所示。所有四个服务器都在同一主机上运行。

图1.一台调度程序和两台执行程序服务器的多服务器拓扑
一台调度程序和两台执行程序服务器的多服务器拓扑

为简单起见,本教程使用Liberty中的嵌入式JMS进行通信,并使用Apache Derby进行数据库。 在多服务器环境中,必须共享作业存储库。 因此,客户机/服务器Derby Network Server允许四台服务器访问Job Repository表结构以存储和检索数据。 表1显示了每个服务器的功能和端口信息。

表1.服务器功能和端口号
服务器名称 服务器功能 HTTP / HTTPS端口 JMS / JMS SSL端口
BatchJMSMessageEngine JMS服务器 不适用 7280/7290
BatchDispatcher 批处理作业分派器/ JMS客户端 9081/9444 不适用
BatchExecutor1 批处理作业执行程序#1 / JMS客户端 9082/9445 不适用
BatchExecutor2 批处理作业执行程序#2 / JMS客户端 9083/9446 不适用

在这种环境中,作业通过REST客户端提交到BatchDispatcher服务器。 基于分配给每个执行器的JMS选择器,在两个执行器服务器中的每个服务器上仅处理某些作业。 步骤6包含有关JMS消息选择器的详细信息,但实质上,选择器指定A型作业始终在一个服务器上处理,而B型作业始终在另一台服务器上处理。

因此,让我们开始吧。 以下步骤从头到尾指导您完成设置此环境的基础知识。

步骤1.安装Liberty服务器

  1. 安装IBM WebSphere V8.5.5.6或更高版本,以访问Liberty的batch-1.0和batchManagement-1.0功能。 批处理1.0功能等效于Java EE 7 JSR-352规范。 batchManagement-1.0功能部件包含IBM包含的所有附件。 下载可用的最新Liberty版本,以确保您具有最新功能。 可以通过以下链接通过Java运行时下载服务器代码: https : //developer.ibm.com/wasdev/getstarted
  2. 将\ wlp文件夹解压缩到要安装Liberty的位置(此处称为< liberty_home >)。

步骤2.创建Liberty服务器

  1. 通过运行server create命令并指定要创建的服务器的名称来创建四个服务器。 从< liberty_home > \ wlp \ bin \文件夹运行命令。
    1. 创建BatchJMSMessageEngine服务器: server create BatchJMSMessageEngine
    2. 创建BatchDispatcher服务器: server create BatchDispatcher
    3. 创建BatchExecutor1服务器: server create BatchExecutor1
    4. 创建BatchExecutor2服务器: server create BatchExecutor2
  2. 这些命令在目录路径< liberty_home > \ wlp \ usr \ servers \中为每个服务器创建一个文件夹及其配置。 图2显示了Liberty服务器的示例文件夹。
    图2.为Liberty服务器创建的文件夹
    为Liberty服务器创建的文件夹

步骤3.安装Apache®Derby

  1. 安装Derby V10.12.1.1或更高版本。 从此链接下载最新版本: https : //db.apache.org/derby/derby_downloads.html
  2. 将Derby发行版解压缩到< liberty_home > \ wlp \ usr \ shared \ resources \ derby \目录中。 \ wlp \ usr \ shared \目录在Liberty中具有与其关联的属性。 因此,在设置server.xml文件时,可以使用${shared.resource.dir}\derby\lib属性指定Derby JDBC驱动程序。
  3. 解压缩Derby发行版之后,您在< liberty_home > \ wlp \ usr \ shared \ resources文件夹下拥有一个文件系统,类似于图3。
    图3.安装创建的Derby文件结构
    安装创建的Derby文件结构

步骤4.配置批处理JMS消息引擎服务器

通过编辑目录< liberty_home > \ wlp \ usr \ servers \ BatchJMSMessageEngine中的server.xml文件,配置批处理JMS(Java Messaging Services)消息引擎服务器。 其他系统使用该服务器通过在服务器配置中定义的batchLibertyQueue队列进行通信。

  1. 启用wasJmsServer-1.0功能,以使JMS嵌入式消息传递在服务器上可用。
    <!-- Enable features -->
    <featureManager>
        <feature>wasJmsServer-1.0</feature>
    </featureManager>
  2. 配置JMS端口(用于SSL的7280和7290),以便服务器可以与环境中服务器上运行的其他JMS客户端通信。 指定wasJmsEndpoint元素和wasJmsPort属性,如下所示
    <!-- Designate the JMS endpoint ports for the message server -->
    <wasJmsEndpoint host="*" wasJmsPort="7280"
        wasJmsSSLPort="7290" enabled="true">
    </wasJmsEndpoint>
  3. 配置要在调度程序服务器和执行程序服务器之间进行通信的队列。 使用queue属性指定messageEngine元素,如下所示:
    <!-- Setup the communication queue utilized by the Batch environment -->
    <messagingEngine>
        <queue id="batchLibertyQueue" forceReliability="ReliablePersistent" receiveAllowed="true" />
    </messagingEngine>
  4. BatchJMSMessageEngine服务器的最终server.xml文件包含在Downloadable resources中的.zip文件中。

步骤5.配置批处理调度程序服务器

通过编辑目录< liberty_home > \ wlp \ usr \ servers \ BatchDispatcher中的server.xml文件,配置批处理调度程序服务器。 必须将BatchDispatcher服务器配置为批处理调度程序,并且它必须同时包含JMS队列设置和Derby数据库设置。 批处理作业通过REST接口提交到此服务器,然后分派到环境中的执行器服务器。

  1. 启用batchManager-1.0功能; 启用此功能会自动启用批处理1.0功能。 启用wasJmsClient-2.0功能以允许与JMS嵌入式消息传递服务器进行通信。
    <!-- Enabled features -->
    <featureManager>
        <feature>wasJmsClient-2.0</feature>
        <feature>batchManagement-1.0</feature>
    </featureManager>
  2. 配置batchJmsDispatcher元素以指示此服务器是批处理调度程序服务器。
    <batchJmsDispatcher connectionFactoryRef="batchConnectionFactory"
        queueRef="batchJobSubmissionQueue" />
  3. 使用jmsConnectionFactory元素配置JMS连接工厂,以便调度程序服务器可以与消息引擎服务器进行通信。 所述remoteServerAddress元素使用wasJmsPort从BatchJMSMessageEngine服务器端点配置的端口(7280),作为显示在下面的代码。
    <jmsConnectionFactory id="batchConnectionFactory"
        jndiName="jms/batch/connectionFactory">
            <properties.wasJms remoteServerAddress="localhost:7280:BootstrapBasicMessaging" />
    </jmsConnectionFactory>
  4. 配置JMS队列以引用在消息引擎服务器上定义的batchLibertyQueue队列。 定义jmsQueue元素,如以下代码所示。 该元素将调度程序与BatchJMSMessageEngine服务器上的JMS队列信息相关联。
    <jmsQueue id="batchJobSubmissionQueue" jndiName="jms/batch/jobSubmissionQueue">
        <properties.wasJms deliveryMode="Persistent" queueName="batchLibertyQueue" 
                readAhead="AsConnection" timeToLive="0">
        </properties.wasJms>
  5. 使用httpEndpoint元素配置HTTP端口,以便可以从Web浏览器访问服务器。 通过REST提交作业时,将在URL中使用此端口。
    <!-- Server HTTP port setup -->
    <httpEndpoint id="defaultHttpEndpoint" httpPort="9081" httpsPort="9444" />
  6. 通过定义batchPersistence元素来配置批处理持久性。 该元素定义您是使用物理数据库还是内存持久性(默认)。
    <!-- Batch persistence config. References a databaseStore. --> 
    <batchPersistence jobStoreRef="BatchDatabaseStore" />
  7. 配置databaseStore元素以定义批处理数据库的名称以及创建批处理表的模式。
    <!-- The database store for the batch tables. -->
     <!-- Note this database store is referenced by the batchPersistence element. -->
     <databaseStore id="BatchDatabaseStore" createTables="true"
        dataSourceRef="batchDB" schema="JBATCH" tablePrefix="" />
  8. 通过定义库元素来配置JDBC驱动程序共享库,该库元素包括derbyclient.jar文件所在的文件集属性。 请注意在引用驱动程序位置的路径时使用$ {shared.resource.dir} Liberty属性,该路径存储在< liberty_home > \ wlp \ usr \ shared \ resources \ derby \中。 要共享作业存储库,请使用derbyclient.jar文件。 该文件是Derby网络客户端JAR文件,它允许多个应用程序在客户端/服务器网络中与Derby进行交互。
    <!-- Derby JDBC driver -->
     <!-- Note this library is referenced by the dataSource element -->
     <library id="DerbyLib">
        <fileset dir="${shared.resource.dir}/derby/lib" includes="derbyclient.jar" />
     </library>
  9. 使用JDBC驱动程序配置dataSource元素。 properties.derby.client元素定义物理数据库的位置以及Derby网络服务器的服务器,端口,用户和密码。
    <!-- Data source for the batch tables. -->
     <!-- Note this data source is referenced by databaseStore element -->
    <dataSource id="batchDB" jndiName="jdbc/batch" type="javax.sql.XADataSource">
        <jdbcDriver libraryRef="DerbyLib" />
        <properties.derby.client createDatabase="create" 
            databaseName="${shared.resource.dir}/databases/BATCHDB"
            serverName="localhost"
            portNumber="1527" user="user" password="pass" />
    </dataSource>
  10. 配置jdbcDriver元素以设置Derby驱动程序的javax.sql.ConnectionPoolDataSourcejavax.sql.XADataSource属性。 该元素必须引用DerbyLib共享库。
    <jdbcDriver id="derbyDriver"
        javax.sql.ConnectionPoolDataSource="org.apache.derby.jdbc.ClientConnectionPoolDataSource"
        javax.sql.XADataSource="org.apache.derby.jdbc.ClientXADataSource"
        libraryRef="DerbyLib" />
  11. 配置batchManagement-1.0功能用于访问REST API的keyStore元素。
    <keyStore id="defaultKeyStore" password="Liberty" />
  12. 配置basicRegistry元素以配置用户ID。 允许这些ID访问批处理REST API,以提交作业和查看作业日志。
    <basicRegistry id="basic" realm="ibm/api">
        <user name="bob" password="bobpwd" />
    </basicRegistry>
  13. 配置authorization-roles元素以将batchAdmin的安全角色分配给用户bob。 batchAdmin角色具有对所有批处理操作的无限制访问权限。 如名称(submitter和monitor)所示,batchSubmitter和batchMonitor角色的特权较少。
    <authorization-roles id="com.ibm.ws.batch">
        <security-role name="batchAdmin">
            <user name="bob" />
        </security-role>
    </authorization-roles>
  14. (可选)您可以通过创建日志记录元素来在调度程序服务器上启用批次跟踪。 使用以下属性可以配置要跟踪的程序包,跟踪文件的名称以及要使用的跟踪文件的大小和数量。
    <!-- Enable Batch tracing for troubleshooting purposes -->
    <logging maxFileSize="200" maxFiles="10"
        traceSpecification="com.ibm.jbatch.*=all:com.ibm.ws.jbatch.*=all"
        traceFileName="trace.log" />
  15. 下载资源中包含BatchDispatcher服务器的最终server.xml文件。

步骤6.配置批处理执行器服务器

通过编辑目录< liberty_home > \ wlp \ usr \ servers \ BatchExecutor1和< liberty_home > \ wlp \ usr \ servers \ BatchExecutor2中的server.xml文件,配置批处理执行器服务器。 在本教程中,批处理执行器服务器的配置步骤仅侧重于其他部分中未介绍的项目。 执行程序服务器的数据库设置,密钥库和安全设置与BatchDispatcher服务器的相似。 必须按照表1中的定义为每个服务器分配唯一的HTTP或HTTPs端口。BatchExecutor1服务器在ActivationSpecification配置上的messageSelector具有唯一值,其值为BatchExecutor1Job.war 。 该BatchExecutor2服务器有不同的messageSelector的价值BatchExecutor2Job.war 。 这些消息选择器定义了用于将作业发送到适当服务器的条件,从而将作业的负载分散到多个服务器上。

  1. 启用wasJmsClient-2.0功能以允许与JMS嵌入式消息传递服务器进行通信。 启用batchManager-1.0功能以启用批处理功能。
    <!-- Enable features -->
    <featureManager>
        <feature>wasJmsClient-2.0</feature>
        <feature>batchManagement-1.0</feature>
    </featureManager>
  2. 配置batchJmsExecutor元素以指示此服务器是批处理执行服务器。 该元素将执行程序与JMS队列信息联系起来。
    <batchJmsExecutor activationSpecRef="batchActivationSpec"
        queueRef="batchJobSubmissionQueue" />
  3. 配置j msActivationSpec元素以连接到JMS消息服务器,并包括消息选择器以过滤掉某些作业。 remoteServerAddress属性包含JMS消息服务器(在我们的方案中为BatchJMSMessageEngine)的主机和端口。 如果将localhost以外的其他名称和端口7280用于JMS消息传递,请更改这些值以匹配您的环境。 messageSelector属性过滤执行程序服务器处理的作业类型。 共有3个默认过滤器:
    • com_ibm_ws_batch_applicationName 。 作业请求的批处理应用程序的名称。
    • com_ibm_ws_batch_moduleName 。 作业请求的批处理应用程序的模块名称。
    • c om_ibm_ws_batch_componentName 。 作业请求的批处理应用程序的组件名称。

    您也可以创建自定义过滤器。 本教程使用com_ibm_ws_batch_moduleName过滤器将请求路由到两个执行器服务器。

    对于BatchExecutor1服务器,使用消息选择器,如下所示:

    <jmsActivationSpec id="batchActivationSpec" maxEndpoints="5">
        <properties.wasJms maxBatchSize="3" maxConcurrency="5"
            messageSelector="com_ibm_ws_batch_moduleName = "
            destinationRef="batchJobSubmissionQueue" destinationType="javax.jms.Queue"
            remoteServerAddress="localhost:7280:BootstrapBasicMessaging">
        </properties.wasJms>
    </jmsActivationSpec>

    对于BatchExecutor2服务器,使用消息选择器,如下所示:

    <jmsActivationSpec id="batchActivationSpec" maxEndpoints="5">
        <properties.wasJms maxBatchSize="3" maxConcurrency="5"
            messageSelector="com_ibm_ws_batch_moduleName = "
            destinationRef="batchJobSubmissionQueue" destinationType="javax.jms.Queue"
            remoteServerAddress="localhost:7280:BootstrapBasicMessaging">
        </properties.wasJms>
    </jmsActivationSpec>
  4. 配置JMS队列以引用batchLibertyQueue队列。 通过使用jmsQueue元素在消息引擎服务器上定义此队列。 该元素将执行程序与BatchJMSMessageEngine服务器上的JMS队列信息相关联。
    <jmsQueue id="batchJobSubmissionQueue" jndiName="jms/batch/jobSubmissionQueue">
        <properties.wasJms deliveryMode="Persistent" queueName="batchLibertyQueue" 
            readAhead="AsConnection" timeToLive="0">
        </properties.wasJms>
    </jmsQueue>
  5. 下载资源中包含BatchExecutor1和BatchExecutor2服务器的最终server.xml文件。

步骤7.安装批处理应用程序

要安装批处理应用程序,请将.war文件复制到其关联的文件夹中:

  • < liberty_home > \ wlp \ usr \ servers \ BatchExecutor1 \ dropins \ BatchExecutor1Job.war
  • < liberty_home > \ wlp \ usr \ servers \ BatchExecutor2 \ dropins \ BatchExecutor2Job.war

如果您的服务器已启动,则应用程序将自动加载,否则将在服务器初始化后启动。

步骤8.测试环境

要测试您刚刚创建的环境,请按照下列步骤操作:

  1. 通过运行位于< liberty_home > \ wlp \ usr \ shared \ resources \ derby \ bin \文件夹中的startNetworkServer.bat文件来启动Derby网络服务器。 启动网络服务器的输出指示它正在监听的端口。 确保此端口(在图4的示例中为1527)与您在BatchDispatcher,BatchExecutor1和BatchExecutor2服务器的数据源元素中配置的端口匹配。
    图4.启动Derby网络服务器
    启动Derby网络服务器
  2. 在< liberty_home > \ wlp \ bin \文件夹中,运行server start < server_name >命令以启动刚刚创建的四台服务器(BatchJMSMessageEngine,BatchDispatcher,BatchExecutor1和BatchExecutor2)。
  3. 提交请求以在BatchExecutor1服务器上处理作业。 您可以使用任何REST客户端或您自己的基于REST的应用程序。 本教程使用Mozilla®Firefox®的Poster插件。

    注意:您还可以使用通过批处理管理功能安装的batchManager命令行客户端实用程序提交作业。 此命令行界面使用Batch REST API提交作业。

    1. 选择工具 -> 海报以从Mozilla Firefox浏览器打开海报。
    2. URL字段中,向在端口9444上运行的BatchDispatcher服务器输入以下请求: https://localhost:9444/ibm/api/batch/jobinstances
    3. 要发送内容字段中,输入以下JSON数据:
      {
      "applicationName" : "BatchExecutor1Job",
      "moduleName" : "BatchExecutor1Job.war",
       "jobXMLName" : "executor1Job"
      }
    4. 图5显示了来自Poster的示例响应:
      图5.向BatchExecutor1服务器提交请求
      向BatchExecutor1服务器提交请求
    5. 单击POST按钮。
    6. 当提示您进行身份验证时(图6),输入在BatchDispatcher的server.xml文件的basicRegistry元素中配置的bob/bobpwd
      图6.对BatchExecutor1服务器进行身份验证
      向BatchExecutor1服务器进行身份验证
    7. 您会收到一条响应,显示一条类似于图7的HTTP“ 201 Created”消息。
      图7.将作业提交到BatchExecutor1服务器后的POST响应
      将作业提交到BatchExecutor1服务器后的POST响应
    8. 从此响应中,您可以看到为该特定批处理作业创建了instanceId为156
    9. 您可以通过对以下URL发出HTTP GET请求来检查作业的状态: https://localhost:9444/ibm/api/batch/jobinstances/156

      作业状态为COMPLETED,如图8所示。

      图8. HTTP GET请求后,executor1Job的作业状态
      HTTP GET请求后executor1Job的作业状态
  4. 提交请求以在BatchExecutor2服务器上处理作业。 重复用于测试BatchExecutor1服务器的过程。
    1. 在要发送的内容字段中输入以下JSON代码段,以在该服务器上运行该应用程序:
      {
      "applicationName" : "BatchExecutor2Job",
      "moduleName" : "BatchExecutor2Job.war",
      "jobXMLName" : "executor2Job"
      }
    2. 从响应中获取instanceId的值,并通过向以下URL发出HTTP GET请求来检查作业的详细信息: https://localhost:9444/ibm/api/batch/jobinstances/<instanceId>

      作业状态为COMPLETED(图9)。

      图9. HTTP GET请求后,executor2Job的作业状态
      HTTP GET请求后executor2Job的作业状态

对环境进行故障排除

在测试环境时,可能会出现一些问题。

  1. 以下错误表明Derby数据库服务器未运行,或者服务器的配置问题阻止其访问Derby数据库(例如,配置了错误的端口)。
    Error 500: javax.batch.operations.BatchRuntimeException: Failed to load JPA PersistenceServiceUnit.
  2. 您的作业挂起,并且看到消息batchStatus = 'STARTING'instanceState = 'JMS_QUEUED' (图10)。 此问题表明您的messageSelector无法正常工作。 批处理作业已排队,但没有执行者在处理该特定类型的消息。 确保为批处理作业创建了正确的messageSelector
    图10. messageSelector不工作时的作业状态
    messageSelector不起作用时的作业状态
  3. 对于其他错误,请在BatchDispatcher,BatchExecutor1和BatchExecutor2服务器上启用跟踪,并查询运行作业时生成的信息。

结论

本教程展示了如何在IBM WebSphere Liberty中设置多服务器Java EE 7批处理环境。 您学习了如何配置嵌入式JMS消息传递服务器,调度程序服务器和多个执行程序服务器。 您还配置了消息选择器以在服务器之间进行负载平衡。

翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1605_hoots-trs/1605_hoots.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值