1

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

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

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

  1. 作业应该与 Web 模块分开,因为 Web 层会在 amazon ec2 insanses 上自动扩展。
  2. 有些工作用钱做非常重要的工作,所以我需要一个非常好的工具来监控工作结果、工作状态、日志等。我需要能够快速修复和停止\启动\取消(如果它冻结出于某种原因)实时单独的特定工作。
  3. 当一切正常时,我需要使用持续交付(CD)。这意味着作业构建在 CI 服务器上并自动部署到测试\生产服务器。预定时间的配置也必须在版本控制之下。

我看了一些解决方案:

  1. 像黑曜石这样的工作服务器。不要认为使用这样的怪物解决方案是个好主意。
  2. 石英。我找不到一种简单的方法来合并需求 2 和 3。使用石英,我可以实时管理我的工作或为工作制作良好的 CD 版本。不在一起。也许我想念什么?
  3. 使用所有库将作业 jar 部署到目标服务器并运行脚本从 cron 运行该脚本。这个解决方案看起来很难看。首先,我需要在每次部署时将我的所有库从 CI 服务器部署到测试\生产服务器,以保持 CI 流程清洁。其次,我真的不认为这是一个好主意。我真的认为我错过了一些东西,对于这个常见的问题有一个很好的解决方案。

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

4

1 回答 1

1

我正在考虑您必须使用一些应用程序服务器,例如 JBoss 或 WebLogic。

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

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

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

这里要注意的是,您的 Service MBean 下只有一个调度程序(对象)实例。因此,如果您停止调度程序,您将停止所有作业。

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

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

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

Thread.currentThread().setName(UNIQUE_NAME_TIMESTAMP);

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

石英。我找不到一种简单的方法来合并需求 2 和 3。使用石英,我可以实时管理我的工作或为工作制作良好的 CD 版本。不在一起。也许我想念什么?

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

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

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

您可以查看此特定教程博客以了解如何编写服务 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 实现动作调用,将其对象编写一个模型类并将其发送到您的服务器。但话又说回来,你总能找到一种方法来停止你的工作。

于 2013-11-09T00:15:29.153 回答