【问题标题】:trigger Java EE batch from cron从 cron 触发 Java EE 批处理
【发布时间】: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 触发。

标签: java cron batch-processing java-ee-7


【解决方案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);
        }
    }
    

    更多信息:

    【讨论】:

    • 谢谢,但这是从应用服务器内部开始的。我正在寻找从应用服务器外部触发批处理启动的最佳方法,从 cron 中触发的 shell 脚本。
    • 如果您不满足于从应用服务器开始,您可能超出了规范的范围并进入了特定于实现的解决方案。您使用的是哪个应用服务器和/或批处理实现? (我知道这是一个很晚的回复,但也许仍有一些价值)。
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多