2014-09-26 87 views
0

我们有一个Web应用程序,通过在Jersey/Tomcat/Apache/PostgreSQL上运行的RESTful Web服务接收传入数据。与这个Web服务应用程序分开,我们有一些需要执行的重复和计划任务。例如,以不同的时间间隔清除不同类型的数据,根据不同的时间表从外部系统提取数据,并根据指定的日期和时间生成报告。Quartz Scheduler - 在Tomcat或应用程序jar中运行?

因此,在阅读了Quartz Scheduler之后,我发现它看起来非常合适。我的问题是:我应该设计我的基于Quartz的调度应用程序在Tomcat中运行(通过QuartzInitializerListener),还是将它构建到独立的应用程序中以作为Linux守护进程运行(例如,通过Apache Commons Daemon或Tanuk Java服务包装)。

一方面,使用Tomcat来托管一个不适合接收http调用的应用程序,这种做法违反了直觉。另一方面,我之前没有使用Apache Commons Daemon或Java Service Wrapper,所以也许在Tomcat内部运行是阻力最小的路径。

我应该知道哪种方法有任何重大的好处或危险?我们的核心模块已经处理数据访问,日志记录等,所以我没有看到这些服务是一个很重要的因素。

我们的调度将由数据驱动,所以我们的基于Quartz的调度器将从PostgreSQL读取相关数据。但是,如果我们在Tomcat中运行调度应用程序,是否可以/合理地通过http调用Tomcat向我们的应用程序发送消息?最后,fwiw,因为我们的工作将由我们现有的应用程序数据驱动,所以我认为Quartz JDBCJobStore没有任何需要。

回答

1

要将Java独立应用程序作为linux守护程序运行,只需使用& -sign结束java-command,以便它在后台运行并将其放入Upstart脚本中。

至于设计:在这种情况下,我会去任何更容易维护。它看起来像在Tomcat中运行一个应用程序已经很熟悉了。想到的一个好处是可以共享/重用配置文件(例如用于数据库),以便只需要维护一组配置文件。

但是,如果您认为计划的任务可能会对资源使用产生重大影响,那么您可能希望在单独的(虚拟)计算机上运行这些任务。由于任务的时间是数据驱动的,所以很难预测确切的负载。例如。可能会发生所有不同的任务在同一时间执行(最坏情况/最高负载情况)。还要考虑计划任务的软件复杂性以及相关的恶意错误风险:如果您认为恶意错误的可能性很低,那么在Web服务旁边运行Tomcat中的任务是一个不错的选择,如果不是的话,作为一个单独的应用程序运行任务。最后,请考虑一般的基础设施:生产线系统(提供对企业至关重要的(连续流动的)数据处理)应与非生产线系统分开。例如。如果报告的创建时间比平时晚一个小时,且业务基本不受影响,那么这是非生产线。但是,如果网络服务停止并且业务受到(立即)影响,那么这就是生产线。清除数据并拉动更新有点灰色:取决于如果这些任务未执行或稍后发生的情况。

+0

感谢您的意见。是的,我可以用nohup和&启动jar,但我觉得守护进程会更好,因为它可以让应用程序正常执行任何关闭操作(例如,完成正在进行的db写入,将应用程序状态写入db如所须)。我仍然觉得我没有看到任何运行Tomcat内部/外部的好处,例如,,在资源消耗方面,但我会继续挖掘。 – ricb 2014-10-01 17:05:10

相关问题