第 20 章 配置批应用程序

JBoss EAP 7 引入了 JSR-352 里定义的 Java 批(batch)应用程序。您可以为运行批应用程序配置环境并用 batch-jberet 子系统管理批任务。

关于开发批应用程序的信息,请参考《JBoss EAP 开发指南》里的『Java 批应用程序开发』章节。

20.1. 配置批任务

您可以用基于 JBeret 实现的 batch-jberet 子系统配置批任务。

默认的 batch-jberet 子系统配置定义了一个 in-memory 任务库和默认的线程池设置。

<subsystem xmlns="urn:jboss:domain:batch-jberet:1.0">
    <default-job-repository name="in-memory"/>
    <default-thread-pool name="batch"/>
    <job-repository name="in-memory">
        <in-memory/>
    </job-repository>
    <thread-pool name="batch">
        <max-threads count="10"/>
        <keepalive-time time="30" unit="seconds"/>
    </thread-pool>
</subsystem>

在默认情况下,任何批任务都会在服务器挂起时停止,并在服务器恢复运行时重新开始。您可以将 restart-jobs-on-resume 属性设置为 false 以让任务保持在 STOPPED 状态。

/subsystem=batch-jberet:write-attribute(name=restart-jobs-on-resume,value=false)

您也可以为批任务仓库线程池配置设置。

20.1.1. 配置批任务仓库

本节介绍了如何使用管理 CLI 配置 in-memory 和 JDBC 任务仓库来存储批任务信息。您也可以使用管理控制台来配置任务仓库。通过 Configuration 标签页进入 Batch 子系统,从左面的菜单中选 In MemoryJDBC

添加 In-memory 任务仓库

您也可以添加在内存里保存批任务信息的任务仓库。

/subsystem=batch-jberet/in-memory-job-repository=REPOSITORY_NAME:add
添加 JDBC 任务仓库

您也可以添加在数据库里保存任务信息的任务仓库。您必须指定 data-source 来连接数据库。

/subsystem=batch-jberet/jdbc-job-repository=REPOSITORY_NAME:add(data-source=java:jboss/datasources/DATASOURCE)
设置默认的任务仓库

您可以设置 in-memory 或 JDBC 任务仓库为批应用程序的默认任务库。

/subsystem=batch-jberet:write-attribute(name=default-job-repository,value=REPOSITORY_NAME)

这要求服务器重启。

重新载入

20.1.2. 配置批线程池

本节介绍了如何使用管理 CLI 配置线程池和线程工厂以供批任务使用。您也可用通过管理控制台配置它们。从 Configuration 标签页进入 Batch 子系统,从左面菜单中选 Thread PoolsThread Factories

配置线程池

当添加线程池时,您必须指定 max-threads,它的值需要大于 3,因为要保留两个线程来确保分区任务可以如期执行。

  1. 添加线程池。

    /subsystem=batch-jberet/thread-pool=THREAD_POOL_NAME:add(max-threads=10)
  2. 如果需要,请设置 keepalive-time 值。

    /subsystem=batch-jberet/thread-pool=THREAD_POOL_NAME:write-attribute(name=keepalive-time,value={time=60,unit=SECONDS})
使用线程工厂
  1. 添加线程工厂。

    /subsystem=batch-jberet/thread-factory=THREAD_FACTORY_NAME:add
  2. 配置线程工厂的属性。

    • group-name - 为这个线程工厂创建的线程组的名称。
    • priority - 所创建线程的优先级。
    • thread-name-pattern - 用于创建线程名称的模板。您可以使用下列形式:

      • %% - 百分比符号
      • %t - 工厂线程的序列号
      • %g - 全局线程序列号
      • %f - 工厂序列号
      • %i - 线程 ID
  3. 分配线程工厂至线陈池。

    /subsystem=batch-jberet/thread-pool=THREAD_POOL_NAME:write-attribute(name=thread-factory,value=THREAD_FACTORY_NAME)

    这要求服务器重启。

    重新载入
设置默认的线程池

您可以指定不同的线程池作为默认线程池。

/subsystem=batch-jberet:write-attribute(name=default-thread-pool,value=THREAD_POOL_NAME)

这要求服务器重启。

重新载入
查看线程池统计信息

您可用 read-resource 管理 CLI 操作查看批线程池的运行时信息。您必须使用 include-runtime=true 参数才能查看这些信息。

/subsystem=batch-jberet/thread-pool=THREAD_POOL_NAME:read-resource(include-runtime=true)
{
    "outcome" => "success",
    "result" => {
        "active-count" => 0,
        "completed-task-count" => 0L,
        "current-thread-count" => 0,
        "keepalive-time" => undefined,
        "largest-thread-count" => 0,
        "max-threads" => 15,
        "name" => "THREAD_POOL_NAME",
        "queue-size" => 0,
        "rejected-count" => 0,
        "task-count" => 0L,
        "thread-factory" => "THREAD_FACTORY_NAME"
    }
}

您也可以通过管理控制台来查看批线程池的运行时信息,如从 Runtime 标签页进入 Batch 子系统。

20.2. 管理批任务

部署的 batch-jberet 子系统资源允许您启动、停止和重启批任务。您也可以查看任务执行的细节。

重启批任务

您可以用 Execution ID 和其他属性重启处于 STOPPEDFAILED 状态的任务。

/deployment=DEPLOYMENT_NAME/subsystem=batch-jberet:restart-job(execution-id=EXECUTION_ID,properties={PROPERTY=VALUE})

Execution ID 必须是任务实例最近执行的 ID。

启动批任务

您可以通过任务 XML 文件启动批任务,并可以指定在启动批任务时需要使用的属性。

/deployment=DEPLOYMENT_NAME/subsystem=batch-jberet:start-job(job-xml-name=JOB_XML_NAME,properties={PROPERTY=VALUE})

停止批任务

您可以通过 execution ID 来停止运行的批任务。

/deployment=DEPLOYMENT_NAME/subsystem=batch-jberet:stop-job(execution-id=EXECUTION_ID)

查看批任务的执行细节

您可以查看批任务执行的细节。您必须使用 include-runtime=true 参数来查看这些运行时信息。

/deployment=DEPLOYMENT_NAME/subsystem=batch-jberet:read-resource(recursive=true,include-runtime=true)
{
    "outcome" => "success",
    "result" => {"job" => {"import-file" => {
        "instance-count" => 2,
        "running-executions" => 0,
        "execution" => {
            "2" => {
                "batch-status" => "COMPLETED",
                "create-time" => "2016-04-11T22:03:12.708-0400",
                "end-time" => "2016-04-11T22:03:12.718-0400",
                "exit-status" => "COMPLETED",
                "instance-id" => 58L,
                "last-updated-time" => "2016-04-11T22:03:12.719-0400",
                "start-time" => "2016-04-11T22:03:12.708-0400"
            },
            "1" => {
                "batch-status" => "FAILED",
                "create-time" => "2016-04-11T21:57:17.567-0400",
                "end-time" => "2016-04-11T21:57:17.596-0400",
                "exit-status" => "Error : org.hibernate.exception.ConstraintViolationException: could not execute statement",
                "instance-id" => 15L,
                "last-updated-time" => "2016-04-11T21:57:17.597-0400",
                "start-time" => "2016-04-11T21:57:17.567-0400"
            }
        }
    }}}
}