首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用java管理计划作业

使用java管理计划作业
EN

Stack Overflow用户
提问于 2013-11-08 23:56:08
回答 1查看 2.8K关注 0票数 1

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

  1. 由maven存储和管理的不同库模块
  2. 扩展到云中许多服务器的web模块
  3. 数据库: sql + nosql
  4. 与数据库一起工作的许多不同的计划作业。

我需要建议如何发展和管理这些预定的工作。我的要求:

  1. 作业应该从web模块中分离出来,因为web层在amazon上是自动缩放的。
  2. 有些工作用钱做非常重要的工作,所以我需要一个非常好的工具来监控工作结果、作业状态、日志等等。我需要一种快速修复的能力,并能够实时停止\start\cancel(如果由于某种原因而冻结)特定的工作。
  3. 我需要使用连续送货(CD)时,所有的工作正常。这意味着作业构建在CI服务器上,并自动部署到测试\生产服务器上。计划时间的配置也必须在版本控制之下。

我看了一些解决方案:

  1. 黑云石这样的作业服务器。不要认为这是一个好主意,使用这样的怪物解决方案。
  2. 石英石。我找不到一个简单的方法,如何合并需求2和3。与石英我可以实时管理我的工作,或为工作做一个好的CD制作。不是在一起。也许我错过了什么?
  3. 将作业jars部署到带有所有库的目标服务器,并运行脚本,从cron运行这些脚本。这个解决方案看起来很难看。首先,我需要在每次部署时部署到测试\生产服务器上的CI服务器上的所有库,以保持CI过程的干净。第二,我真的认为这是一个好主意。我真的认为我错过了一些东西,对于这个通常的问题,有一个很好的解决办法。

你能给我点建议吗?开发人员通常是如何使用CD进程管理计划作业的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-09 00:15:29

我认为您一定是在使用像JBoss或WebLogic这样的应用服务器。

我建议编写一个服务MBean,它将使用石英加载计划中的作业

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

QuartZ的优点是它是非常可靠的。你将能够管理个人工作。

在这里捕获是只有一个调度程序(对象)在您的服务MBean的实例。所以如果你停止调度程序,你就会停止所有的作业。

您可以创建一个单独的记录器类别来处理QuartZ作业。

请提供更多的输入,如您正在使用的应用服务器。不同的应用服务器有不同的特性,这可能是有用的。尽管你应该能够在其中任何一个中实现你的所有想法

我有一个类似的应用程序运行在JBoss AS7上,在作业的执行逻辑中,每个作业都是一个线程。

代码语言:javascript
复制
Thread.currentThread().setName(UNIQUE_NAME_TIMESTAMP);

通过这种方式,我能够标记每个周期特定作业的执行情况。

石英。我找不到一个简单的方法,如何合并需求2和3。与石英我可以实时管理我的工作,或为工作做一个好的CD制作。不是在一起。也许我错过了什么?

您确实需要一个像JBoss这样的应用服务器。它可以为您提供一个稳定的web容器,完全通过Java认证,简化了您的API集成。

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

我希望你知道怎么写非典。如果没有,那是很容易的。我喜欢JBoss,因为它的概念简单,易于使用,并且非常强大的Application。

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

让我们来谈谈MyServerMonitorMBean

代码语言:javascript
复制
package custom.mbean;
public interface MyServerMonitorMBean
{
  public void setFrequency(String frequency);
  public String getFrequency();
}

正如您所注意到的,有一些方法声明需要在MBean的实现中实现。

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

然后,您可以通过j控制台连接到JBoss JMXconsole。你可以在这里查一下

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

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

--1--这将打开连接,允许您查看在服务器上运行MBeans (这将是连接后的JConsole的MBean选项卡)。 --2--您的mbean将是service.server.monitor (取自前面示例的名称)。 -3--你会发现这些行动是作为行动出现的 -4-如果您已经声明了方法有一些参数,您将看到这些方法参数有单独的值持有者,您可以将这些参数传递给服务。 --5--在我的代码中,我将jobStart和jobStop公开为两个操作

代码语言:javascript
复制
@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 )。正如我早些时候所说,所有这些想法都需要测试。因此,我正在考虑,如果掌握了它的诀窍,你就能想出一个好的解决办法。

再一次思考,您甚至可以通过JMS实现动作调用,编写一个来自其对象的模型类并将其发送到您的服务器。但话又说回来,你总是可以想出一个方法来停止你的工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19870607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档