使用java管理预定作业

时间:2013-11-08 23:56:09

标签: java cron continuous-integration quartz-scheduler continuous-delivery

我在java上有一个复杂的Web应用程序。它包含:

  1. 由maven存储和管理的不同库模块
  2. 可扩展到云中许多服务器的Web模块
  3. 数据库:sql + nosql
  4. 许多不同的预定作业可以使用数据库。
  5. 我需要建议如何开发和管理这些预定的工作。我的要求:

    1. 作业应该与网络模块分开,因为网络层自动扩展到亚马逊ec2 insanses。
    2. 有些工作用钱做了非常重要的工作,所以我需要一个非常好的工具来监控工作结果,工作状态,日志等。我需要一个能够制作非常快速的修补程序和能够停止\开始\取消的能力(如果由于某种原因冻结了特定的工作,实时分开。
    3. 当一切正常时,我需要使用持续交付(CD)。这意味着作业在CI服务器上构建,并自动部署到测试\生产服务器。计划时间的配置也必须在版本控制之下。
    4. 我看了一些解决方案:

      1. obsidian等作业服务器。不要认为使用像这样的怪物解决方案是个好主意。
      2. quartz。我找不到一个简单的方法来合并第2和第3项要求。使用quartz我可以实时管理我的工作或为工作做一个很好的CD构建。不在一起。也许我错过了什么?
      3. 使用所有库和运行脚本将作业jar部署到目标服务器从cron运行该脚本。这个解决方案看起来很难看首先,我需要在每次部署时从CI服务器部署到测试\生产服务器的所有库,以保持CI流程的清洁。其次,我真的认为这根本不是一个好主意。我真的认为我错过了一些东西,这个常见的问题有一个很好的解决方案。
      4. 你可以给我建议吗?开发人员通常如何使用CD流程管理预定作业?

1 个答案:

答案 0 :(得分:1)

我在考虑你必须使用像JBoss或WebLogic这样的应用服务器。

我建议编写一个Service MBean,它将使用quartz

加载您的预定作业

使用Service MBean的好处是,您可以公开操作。调用这些操作你应该能够停止开始工作。

QuartZ的好处是非常可靠。您将能够管理个人工作。

这里的Catch是Service MBean下只有一个scheduler(object)实例。因此,如果您停止调度程序,则会停止所有作业。

您可以创建单独的记录器类别以使用QuartZ作业

请提供更多输入,例如您正在使用的应用程序服务器。 不同的应用服务器具有可能有用的不同功能。虽然你应该能够在任何一个中实现你的所有想法

我在JBoss AS7上运行了类似的应用程序,每个作业都是一个独立的线程 在Job的执行逻辑中,我做

Thread.currentThread().setName(UNIQUE_NAME_TIMESTAMP);

通过这种方式,我可以在每个周期标记特定作业的执行。

  
    

石英。我找不到一个简单的方法来合并第2和第3项要求。使用quartz我可以实时管理我的工作或为工作做一个很好的CD构建。不在一起。也许我错过了什么?

  

你真的需要像JBoss这样的应用服务器。它可以为您提供稳定的Web容器,完全通过Java EE认证,可以简化您的API集成。

  

---- ---- == == --- ---- == == --- ---- == == --- ---- == == - - == ---- == --- ---- == == ----

我希望你知道如何写SAR。如果不是仍然很容易。我喜欢JBoss,因为它的概念很简单,易于使用,而且它是非常强大的Application Server。

您可以查看此特定教程博客,了解如何编写服务MBean http://middlewaremagic.com/jboss/?p=366

让我们谈谈MyServerMonitorMBean

package custom.mbean;
public interface MyServerMonitorMBean
{
  public void setFrequency(String frequency);
  public String getFrequency();
}

正如您将注意到的那样,需要实现MBean的实现方法声明。

在Java EE体系结构中,这意味着您实际上是在暴露操作。可以从外部调用以调用某些命令的操作。现在,只有在接口MBean中声明的方法才有这个概念。

然后您可以通过jconsole连接到JBoss JMXconsole。你可以在这里查看

  

https://community.jboss.org/wiki/UsingJconsoleToConnectToJMXOnAS7

---- ---- == == --- ---- == == --- ---- == == --- ---- == == - - == ---- == --- ---- == == ----

  
    

- 1--这将打开连接,允许您在服务器上查看正在运行的MBean(连接后将是JConsole的MBean选项卡)

         

- 2--你的mbean将是service.server.monitor(取自上一个例子的名称)

         

- 3--你会发现显示为操作的动作

         

- 4--如果你宣布方法有一些参数,你会看到有个人     您可以传递给服务的那些方法参数的值持有者

         

- 5--在我的代码中,我将jobStart和jobStop暴露为两个动作

  
@Override
public void jobStart() {
    this.loadJob(SchedHourlyJob.class, "hourlyjob", "grouphourly", START_INTERVAL, EXECUTION_INTERVAL);
}

@Override
public void jobStop() {
    logger.info("-- jobStop. Stopping Scheduled Job");

    try {
        scheduler.deleteJob(new JobKey("hourlyjob", "grouphourly"));
    } catch (SchedulerException schedEx) {
        logger.error("Failed to stop scheduled job. Exception message and stacktrace  ==> " ,schedEx);
    }
}
  
    

- 6--公开类似的行动以开始停止或更改单个作业或完成计划程序。

         

- 7--你也可以暂停工作,引发一些变化并重新开始。所有这些操作使得Quartz成为一个很好的作业调度API

         

- 8--在JBoss中可以进行热部署。您可以在多个sar中使用应用程序来共享公共库。您可以围绕JBoss的这些功能进行测试。我知道热门部署是你非常关注的事情。

  

我希望通过这一切,我很好地解释了逻辑。 这也是处理这个问题的一种方法,你也可以提出自己的一些方法。

请记住实施是您处理要求的方式。

刚才我想,制作类名,作业名可以形成一种非常通用的方法来停止或暂停公共类(Service MBean)中的作业。正如我之前所说,所有这些想法都需要进行测试。因此,我正在考虑如果掌握它,你将能够提出一个很好的解决方案

再一次思考,您甚至可以实现JMS的动作调用,将模型类写入其对象并将其发送到您的服务器。但话又说回来,你总能找到一种方法来阻止你的工作。