2011-03-19 61 views
1

在rails web应用程序中,如果我将消息写入像rabbitmq这样的队列,那么生产者将消息发送到队列时如何通知客户端?使用rabbitmq与rails,如何创建无限循环过程?

我猜我必须创建一个单独的进程,在后台运行来回复正确的消息?即此代码不在Web应用程序的范围内。

如果是这样的话,是否有可能重新使用rails应用程序中的models/libs?我必须在2个地方复制这些代码吗?

+0

我的一个朋友使用https://github.com/tobi/delayed_job做后台任务。我不太了解它(不是一个rails的开发者),但也许看看它? – notJim 2011-03-19 20:12:35

回答

5

它看起来像你的应用程序需要什么通常称为背景工人过程。对于任何适度复杂的Web应用程序,这是一个相当常见的要求。

我猜我必须创建一个单独的进程,在后台运行,以响应消息正确吗?

是的 - 你说得对。尽管使用线程来处理后台任务(在你的情况下,阅读和处理来自RabbitMQ的消息)是完全可能的,但Rails应用程序的标准和推荐路线是运行一个单独的后台进程。

如果是这种情况,是否有可能重新使用rails应用程序中的models/libs?

绝对。最简单的方法是使用Rails的built in runner command

另一种选择是创建一个加载Rails应用程序的ruby脚本。举例来说,你可以在你的项目的根目录中创建的文件my_script.rb,这可能会是这个样子:

# Load my application: 
require File.join(File.dirname(__FILE__), 'config/environment.rb') 

# Now you can access your Rails environment as normal: 
MyModel.all.each { |x| x.do_something } 

如果你的需求变得越来越复杂,或者你发现你需要运行多个后台进程要跟上您需要处理的数据量,您可能需要查看many available libraries and frameworks之一,这可以帮助解决这个问题。

创建后台进程后,您需要一种方法将其部署到生产服务器时不断运行。正如ctcherry所建议的那样,虽然可以使用daemons这样的库,但我建议使用专用工具,如upstart(如果部署到Ubuntu)或runit。最受欢迎的选项是available here

+0

是的,我有兴趣创建多个工作进程,而不仅仅是一个后台进程。 – Blankman 2011-03-19 19:38:00

0

你是对的,你需要一个后台进程。如果你愿意的话,你可以把这个过程的代码保存在Rails项目的lib文件夹中,之前我已经做到了,没有问题,并且它将相关的代码保存在一起,这很好。

我用这个库创建我的长时间运行的过程中,这是很简单的:

http://daemons.rubyforge.org/

为了从Rails应用程序重复使用的模型,你可以在config/environment.rb文件运行require让一切都加载。 (首先将RAILS_ENV设置为环境变量以选择正确的环境)从这一点开始,脚本的行为就像您在轨道控制台会话中一样。

相关问题