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服务器
- 安装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 。
- 将\ wlp文件夹解压缩到要安装Liberty的位置(此处称为< liberty_home >)。
步骤2.创建Liberty服务器
- 通过运行
server create
命令并指定要创建的服务器的名称来创建四个服务器。 从< liberty_home > \ wlp \ bin \文件夹运行命令。- 创建BatchJMSMessageEngine服务器:
server create BatchJMSMessageEngine
- 创建BatchDispatcher服务器:
server create BatchDispatcher
- 创建BatchExecutor1服务器:
server create BatchExecutor1
- 创建BatchExecutor2服务器:
server create BatchExecutor2
- 创建BatchJMSMessageEngine服务器:
- 这些命令在目录路径< liberty_home > \ wlp \ usr \ servers \中为每个服务器创建一个文件夹及其配置。 图2显示了Liberty服务器的示例文件夹。
图2.为Liberty服务器创建的文件夹
步骤3.安装Apache®Derby
- 安装Derby V10.12.1.1或更高版本。 从此链接下载最新版本: https : //db.apache.org/derby/derby_downloads.html
- 将Derby发行版解压缩到< liberty_home > \ wlp \ usr \ shared \ resources \ derby \目录中。 \ wlp \ usr \ shared \目录在Liberty中具有与其关联的属性。 因此,在设置server.xml文件时,可以使用
${shared.resource.dir}\derby\lib
属性指定Derby JDBC驱动程序。 - 解压缩Derby发行版之后,您在< liberty_home > \ wlp \ usr \ shared \ resources文件夹下拥有一个文件系统,类似于图3。
图3.安装创建的Derby文件结构
步骤4.配置批处理JMS消息引擎服务器
通过编辑目录< liberty_home > \ wlp \ usr \ servers \ BatchJMSMessageEngine中的server.xml文件,配置批处理JMS(Java Messaging Services)消息引擎服务器。 其他系统使用该服务器通过在服务器配置中定义的batchLibertyQueue队列进行通信。
- 启用wasJmsServer-1.0功能,以使JMS嵌入式消息传递在服务器上可用。
<!-- Enable features --> <featureManager> <feature>wasJmsServer-1.0</feature> </featureManager>
- 配置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>
- 配置要在调度程序服务器和执行程序服务器之间进行通信的队列。 使用
queue
属性指定messageEngine
元素,如下所示:<!-- Setup the communication queue utilized by the Batch environment --> <messagingEngine> <queue id="batchLibertyQueue" forceReliability="ReliablePersistent" receiveAllowed="true" /> </messagingEngine>
- BatchJMSMessageEngine服务器的最终server.xml文件包含在Downloadable resources中的.zip文件中。
步骤5.配置批处理调度程序服务器
通过编辑目录< liberty_home > \ wlp \ usr \ servers \ BatchDispatcher中的server.xml文件,配置批处理调度程序服务器。 必须将BatchDispatcher服务器配置为批处理调度程序,并且它必须同时包含JMS队列设置和Derby数据库设置。 批处理作业通过REST接口提交到此服务器,然后分派到环境中的执行器服务器。
- 启用batchManager-1.0功能; 启用此功能会自动启用批处理1.0功能。 启用wasJmsClient-2.0功能以允许与JMS嵌入式消息传递服务器进行通信。
<!-- Enabled features --> <featureManager> <feature>wasJmsClient-2.0</feature> <feature>batchManagement-1.0</feature> </featureManager>
- 配置
batchJmsDispatcher
元素以指示此服务器是批处理调度程序服务器。<batchJmsDispatcher connectionFactoryRef="batchConnectionFactory" queueRef="batchJobSubmissionQueue" />
- 使用
jmsConnectionFactory
元素配置JMS连接工厂,以便调度程序服务器可以与消息引擎服务器进行通信。 所述remoteServerAddress
元素使用wasJmsPort
从BatchJMSMessageEngine服务器端点配置的端口(7280),作为显示在下面的代码。<jmsConnectionFactory id="batchConnectionFactory" jndiName="jms/batch/connectionFactory"> <properties.wasJms remoteServerAddress="localhost:7280:BootstrapBasicMessaging" /> </jmsConnectionFactory>
- 配置JMS队列以引用在消息引擎服务器上定义的batchLibertyQueue队列。 定义
jmsQueue
元素,如以下代码所示。 该元素将调度程序与BatchJMSMessageEngine服务器上的JMS队列信息相关联。<jmsQueue id="batchJobSubmissionQueue" jndiName="jms/batch/jobSubmissionQueue"> <properties.wasJms deliveryMode="Persistent" queueName="batchLibertyQueue" readAhead="AsConnection" timeToLive="0"> </properties.wasJms>
- 使用
httpEndpoint
元素配置HTTP端口,以便可以从Web浏览器访问服务器。 通过REST提交作业时,将在URL中使用此端口。<!-- Server HTTP port setup --> <httpEndpoint id="defaultHttpEndpoint" httpPort="9081" httpsPort="9444" />
- 通过定义
batchPersistence
元素来配置批处理持久性。 该元素定义您是使用物理数据库还是内存持久性(默认)。<!-- Batch persistence config. References a databaseStore. --> <batchPersistence jobStoreRef="BatchDatabaseStore" />
- 配置
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="" />
- 通过定义库元素来配置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>
- 使用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>
- 配置
jdbcDriver
元素以设置Derby驱动程序的javax.sql.ConnectionPoolDataSource
和javax.sql.XADataSource
属性。 该元素必须引用DerbyLib共享库。<jdbcDriver id="derbyDriver" javax.sql.ConnectionPoolDataSource="org.apache.derby.jdbc.ClientConnectionPoolDataSource" javax.sql.XADataSource="org.apache.derby.jdbc.ClientXADataSource" libraryRef="DerbyLib" />
- 配置batchManagement-1.0功能用于访问REST API的
keyStore
元素。<keyStore id="defaultKeyStore" password="Liberty" />
- 配置
basicRegistry
元素以配置用户ID。 允许这些ID访问批处理REST API,以提交作业和查看作业日志。<basicRegistry id="basic" realm="ibm/api"> <user name="bob" password="bobpwd" /> </basicRegistry>
- 配置
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>
- (可选)您可以通过创建日志记录元素来在调度程序服务器上启用批次跟踪。 使用以下属性可以配置要跟踪的程序包,跟踪文件的名称以及要使用的跟踪文件的大小和数量。
<!-- Enable Batch tracing for troubleshooting purposes --> <logging maxFileSize="200" maxFiles="10" traceSpecification="com.ibm.jbatch.*=all:com.ibm.ws.jbatch.*=all" traceFileName="trace.log" />
- 可下载资源中包含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
。 这些消息选择器定义了用于将作业发送到适当服务器的条件,从而将作业的负载分散到多个服务器上。
- 启用wasJmsClient-2.0功能以允许与JMS嵌入式消息传递服务器进行通信。 启用batchManager-1.0功能以启用批处理功能。
<!-- Enable features --> <featureManager> <feature>wasJmsClient-2.0</feature> <feature>batchManagement-1.0</feature> </featureManager>
- 配置
batchJmsExecutor
元素以指示此服务器是批处理执行服务器。 该元素将执行程序与JMS队列信息联系起来。<batchJmsExecutor activationSpecRef="batchActivationSpec" queueRef="batchJobSubmissionQueue" />
- 配置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>
-
- 配置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>
- 可下载资源中包含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.测试环境
要测试您刚刚创建的环境,请按照下列步骤操作:
- 通过运行位于< liberty_home > \ wlp \ usr \ shared \ resources \ derby \ bin \文件夹中的startNetworkServer.bat文件来启动Derby网络服务器。 启动网络服务器的输出指示它正在监听的端口。 确保此端口(在图4的示例中为1527)与您在BatchDispatcher,BatchExecutor1和BatchExecutor2服务器的数据源元素中配置的端口匹配。
图4.启动Derby网络服务器
- 在< liberty_home > \ wlp \ bin \文件夹中,运行
server start
< server_name >命令以启动刚刚创建的四台服务器(BatchJMSMessageEngine,BatchDispatcher,BatchExecutor1和BatchExecutor2)。 - 提交请求以在BatchExecutor1服务器上处理作业。 您可以使用任何REST客户端或您自己的基于REST的应用程序。 本教程使用Mozilla®Firefox®的Poster插件。
注意:您还可以使用通过批处理管理功能安装的batchManager命令行客户端实用程序提交作业。 此命令行界面使用Batch REST API提交作业。
- 选择工具 -> 海报以从Mozilla Firefox浏览器打开海报。
- 在URL字段中,向在端口9444上运行的BatchDispatcher服务器输入以下请求:
https://localhost:9444/ibm/api/batch/jobinstances
- 在要发送的内容字段中,输入以下JSON数据:
{ "applicationName" : "BatchExecutor1Job", "moduleName" : "BatchExecutor1Job.war", "jobXMLName" : "executor1Job" }
- 图5显示了来自Poster的示例响应:
图5.向BatchExecutor1服务器提交请求
- 单击POST按钮。
- 当提示您进行身份验证时(图6),输入在BatchDispatcher的server.xml文件的basicRegistry元素中配置的
bob/bobpwd
。图6.对BatchExecutor1服务器进行身份验证
- 您会收到一条响应,显示一条类似于图7的HTTP“ 201 Created”消息。
图7.将作业提交到BatchExecutor1服务器后的POST响应
- 从此响应中,您可以看到为该特定批处理作业创建了instanceId为
156
。 - 您可以通过对以下URL发出HTTP GET请求来检查作业的状态:
https://localhost:9444/ibm/api/batch/jobinstances/156
。作业状态为COMPLETED,如图8所示。
图8. HTTP GET请求后,executor1Job的作业状态
- 提交请求以在BatchExecutor2服务器上处理作业。 重复用于测试BatchExecutor1服务器的过程。
- 在要发送的内容字段中输入以下JSON代码段,以在该服务器上运行该应用程序:
{ "applicationName" : "BatchExecutor2Job", "moduleName" : "BatchExecutor2Job.war", "jobXMLName" : "executor2Job" }
- 从响应中获取instanceId的值,并通过向以下URL发出HTTP GET请求来检查作业的详细信息:
https://localhost:9444/ibm/api/batch/jobinstances/<instanceId>
作业状态为COMPLETED(图9)。
图9. HTTP GET请求后,executor2Job的作业状态
- 在要发送的内容字段中输入以下JSON代码段,以在该服务器上运行该应用程序:
对环境进行故障排除
在测试环境时,可能会出现一些问题。
- 以下错误表明Derby数据库服务器未运行,或者服务器的配置问题阻止其访问Derby数据库(例如,配置了错误的端口)。
Error 500: javax.batch.operations.BatchRuntimeException: Failed to load JPA PersistenceServiceUnit.
- 您的作业挂起,并且看到消息
batchStatus = 'STARTING'
和instanceState = 'JMS_QUEUED'
(图10)。 此问题表明您的messageSelector
无法正常工作。 批处理作业已排队,但没有执行者在处理该特定类型的消息。 确保为批处理作业创建了正确的messageSelector
。图10. messageSelector不工作时的作业状态
- 对于其他错误,请在BatchDispatcher,BatchExecutor1和BatchExecutor2服务器上启用跟踪,并查询运行作业时生成的信息。
结论
本教程展示了如何在IBM WebSphere Liberty中设置多服务器Java EE 7批处理环境。 您学习了如何配置嵌入式JMS消息传递服务器,调度程序服务器和多个执行程序服务器。 您还配置了消息选择器以在服务器之间进行负载平衡。
翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1605_hoots-trs/1605_hoots.html