从 cron 触发 Java EE 批处理

Posted

技术标签:

【中文标题】从 cron 触发 Java EE 批处理【英文标题】:trigger Java EE batch from cron 【发布时间】:2014-09-07 04:21:20 【问题描述】:

JavaEE 7 应用服务器支持实现 JSR 352 的批处理操作(Glassfish 和 Wildfly 支持)。

从 Unix cron 启动批处理操作的好方法是什么?

执行 wget/curl 启动批处理的 rest servlet 通过 JMX 调用应用服务器的 exec java(java 启动缓慢,是否有用于 C 的 JMX?) ??

【问题讨论】:

问题是关于从应用程序服务器外部触发批处理作业,而不是关于 JEE 调度服务。许多 IT 运营部门希望通过企业调度系统(如 cron 或 uc4)启动批处理作业。甚至可以尝试从 Jenkins 触发。 【参考方案1】:

调度 Java EE 7 批处理作业可以通过以下几种方式完成:

使用支持类似 cron 语法的 @Schedule 注释 使用 ManagedScheduledExecutorService

更多详情请访问:

http://blog.arungupta.me/2014/07/schedule-javaee7-batch-jobs-techtip36/

如果您想使用 curl 调用,那么您可以使用 @GET 注释将代码放在 REST 端点中。添加命令以在 crontab 中调用此端点。

【讨论】:

【参考方案2】:

可以通过 jboss-cli.sh(异步启动)启动 Jboss EAP 7 批处理作业(符合 Java EE 7 JSR 352)。

来源:Red Hat JBoss Enterprise Application Platform 7.0 配置指南。

Wildfly 应该是类似的。

以下是用于启动 JBOSS EAP7 批处理作业的 bash 脚本示例:

#!/bin/bash
JBOSS_HOME=/path_to_jboss_eap7_directory
DEPLOY=my_deploy_name.war
JOB_NAME=my_batch_name.xml

$JBOSS_HOME/bin/jboss-cli.sh \
        --connect \
        --command="/deployment=$DEPLOY/\
        subsystem=batch-jberet:\
        start-job(job-xml-name=$JOB_NAME)"

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案3】:

Java EE 7 通过 @Schedule 注释支持 cron 作业。您可以使用一种方法来触发您的批处理工作。这是一个基本示例:

@Singleton
@Startup
public class CronJobs 
    @Resource
    TimerService timerService;

    public void setTimer(long intervalDuration) 
        Timer timer = timerService.createTimer(intervalDuration, 
            "Created new programmatic timer");
    

    @Schedule(second = "0", minute = "0", hour = "*/1")
    public void fireFooBatch() 
        JobOperator jobOperator = BatchRuntime.getJobOperator();
        Properties props = new Properties();
        props.setProperty("someProperty", "someValue");
        long execID = jobOperator.start("yourJob", props);
    

更多信息:

Java EE 7 Tutorial. 34.4 Using the Timer Service. Java EE 7 Tutorial. 55 Batch Processing.

【讨论】:

谢谢,但这是从应用服务器内部开始的。我正在寻找从应用服务器外部触发批处理启动的最佳方法,从 cron 中触发的 shell 脚本。 如果您不满足于从应用服务器开始,您可能超出了规范的范围并进入了特定于实现的解决方案。您使用的是哪个应用服务器和/或批处理实现? (我知道这是一个很晚的回复,但也许仍有一些价值)。

以上是关于从 cron 触发 Java EE 批处理的主要内容,如果未能解决你的问题,请参考以下文章

Quartz cron 触发器在每天 00 时运行的表达式是啥?

春季批处理调度期间出现的错误

java ee wildfly 批处理 job 工作

java 休息Java EE异常处理

Kubernetes 通过基于时间的触发器扩展 pod

Tomcat 无法处理的 Java EE 场景