正确的方法来实现独立的Grails批处理过程?

时间:2012-08-02 13:27:31

标签: grails gorm batch-processing

我想实现以下内容:

  1. Grails中的Web应用程序转到MongoDB数据库
  2. 长时间运行的批处理过程在后台填充和更新该数据库
  3. 我希望他们两个都重用相同的Grails服务和相同的GORM域类(使用Grails的mongodb插件)。

    对于Web应用程序,一切都应该正常工作,包括动态GORM查找器方法。

    但我无法弄清楚如何实施批处理。

    一个。如果我将它们作为Grails服务方法实现,它们的长期运行性质将是一个问题。即使将它们包装在一些异步执行程序中也会使所有内容复杂化,因为我希望它们都是一个单独的Java进程,因此可以轻松地单独监视和停止它们。

    湾如果我将它们实现为src / groovy脚本并尝试从命令行启动,我无法正确注入Grails服务(ApplicationHolder方法抛出NPE)或使GORM finder方法起作用。独立的GORM指南都考虑到了Hibernate,总的来说它似乎不是正确的选择。

    ℃。我考虑过'批处理启动程序'Grails插件,但它无法安装,似乎有点遗弃。

    d。我考虑了'run-script'Grails命令来运行src / groovy中的脚本,看起来它实际上可以在开发中工作,但在生产中似乎不是正确的做法。

    我不可能是唯一一个有这样问题的人 - 所以它如何解决?

    人们如何运行与Grails应用程序共享代码库和数据库的独立脚本?

1 个答案:

答案 0 :(得分:3)

由于您希望作业处理位于与前端应用程序不同的JVM中,因此最简单的方法是运行两个Grails实例,一个用于提供Web请求的前端,以及其他来处理工作处理。

值得庆幸的是,Grails插件的丰富生态系统使这种事情变得非常简单,尽管可能效率不高,因为运行整个Grails应用程序只是为了处理有点过分。

我倾向于这样做的方法是将我的应用程序编写为一个应用程序,其中包含处理作业处理的服务。这些服务与RabbitMQ插件相关联,因此一般流程是Web请求(或石英预定作业)将作业放入工作队列,然后工作服务负责处理它们。

这样做的好处是,由于它是一个应用程序,我可以完全访问所有域对象等,我可以利用消息队列的不连接特性来扩展我的前端 - 和后端分开而不需要多个应用程序。相反,我可以多次安装相同的应用程序,并配置专用于处理作业和/或作业处理器正在查看的队列的线程数。

所以,通过这个设置,对于开发,我通常只会将作业处理线程的数量设置为我正在进行的开发工作的任何意义,然后只是一个简单的grails run-app,并且我有一个功能齐全的系统(假设我有一个运行的RabbitMQ服务器也可以使用)。

然后,当我进入生产部署时,我部署了2个应用程序实例,一个用于前端工作,另一个用于后端工作。我只是将前端实例配置为具有1或0个线程来处理作业,而后端实例我提供了更多线程。这使我可以根据需要更新任一部分,或者如果我需要缩放一部分或另一部分,则可以启动更多实例。

我确定还有其他方法可以做到这一点,但我发现这两个真的易于开发(因为它是所有应用程序) ,也非常容易部署,扩展和维护。