自动在Rails中创建全局对象

时间:2012-05-09 21:16:36

标签: ruby ruby-on-rails-3 oop

我有一个带有类的库,在创建时,它会定期自动从一系列FTP服务器中抓取数据。它是线程化的,您可以简单地调用“结果”方法来查看到目前为止的结果。我对rails很新,但我想为这个对象创建一个Web界面,允许人们看到结果,启动它,停止它,基本上只是与对象进行交互。我希望它首先创建并保持完整,无论是否有人使用Web界面,以便它可以在后台运行并收集数据。我还希望它可以从控制器访问,以便我可以有开始/停止/信息页面。关于实现这一目标的最佳途径的任何想法?

P.S。我正在运行Rails 3.2.3和Ruby 1.9.3

4 个答案:

答案 0 :(得分:2)

有更好的方法来运行后台进程并从rails应用程序访问它,但是直接回答你的问题:

把它放在初始化器中。有一个/ config / initializers目录。将.rb文件放在那里,它会在你的rails应用程序启动时自动运行。

/config/initializers/hello.rb:

Rails.logger.debug "Hello World"

启动您的rails服务器,您将看到“Hello World”

要使您的类的实例全局可用,只需创建一个全局var:

MYCLASS = MyClass.new

答案 1 :(得分:0)

您不应该在Rails应用程序中创建线程。这很麻烦,很危险,因为Rails不是一个单一的过程,而是由你的启动器框架创建的一些过程,比如Passenger,那么你需要在每个进程中都有一个这个对象的实例,这可能会重复工作。 / p>

更好的方法是在后台运行一个单一的进程,但是暴露出某种可以被各种Rails实例使用的API。一种方法是使用Memcached,Redis,传统数据库甚至平面文件等系统作为共享存储系统。另一种方法是通过公开可以由Rails使用的接口来直接响应API调用。制作一个“讲memcached”的过程并不太难。

通常,最简单的方法是使用共享存储来完成工作。它易于使用,更容易检查过程是否产生了正确的结果。例如,使用ActiveRecord将抓取结果保存到数据库中,并使用这些相同的模型在应用程序内部取回数据。

您在Rails应用程序中构建的内容是访问此共享数据的某种包装器。这可能是一系列ActiveRecord模型,一些Memcached调用或其他东西,但最终结果将是一个可以在N个进程中独立运行的干净界面。

答案 2 :(得分:0)

嗯。这是在Linux机器上运行吗?

如果是这样,你可以轻松编写一个守护进程&可选择让它在系统启动时启动。我把数据放在一起可能是它当前的状态(运行/关闭)到某种内存存储(Memcache?Redis)或数据库。您的控制器从那里访问数据。

您也可以让控制器直接执行/etc/init.d/my_service stop/start/restart之类的操作。

如果您打算让很多这些小型守护进程运行,可能在不同的机器上运行(或由其管理),我建议您编写一个应用程序来管理他们的状态&通过像RabbitMQ这样的东西与它进行交流,但这可能对你想做的事情有点过分。

答案 3 :(得分:0)

Redis和Resque是您想要的 - 以及您的rails应用程序。

Redis:http://redis.io/

Resque:https://github.com/defunkt/resque

Redis是一个缓存服务器,resque是一个基于它构建的作业调度工具。 Resque有很多可以使用它的扩展,可以让你自定义和扩展它的行为。例如:

Resque还附带一个web ui,可让您跟踪所有作业和队列的状态。

因此,我基本上通过创建一个允许您启动作业的页面来构建您的应用程序 - 或者监视正在运行的作业的完成或进度。

您的所有工作都将在“工作”服务器上运行,并且与rails应用程序无关。所有进度数据都将以redis形式存储,因此如果您的rails应用程序重新启动,您只需在重新启动时连接到redis,并且您拥有当前数据。

所有这些基础设施在Heroku以及使用他们的'Redis-to-Go'附加组件上工作得非常好。我目前将它用于许多任务,并且效果很好。