0

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

PS 我正在运行 Rails 3.2.3 和 Ruby 1.9.3

4

4 回答 4

2

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

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

/config/initializers/hello.rb:

Rails.logger.debug "Hello World"

启动你的 Rails 服务器,你会看到“Hello World”

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

MYCLASS = MyClass.new
于 2012-05-09T21:20:04.507 回答
0

您不应该在 Rails 应用程序中创建线程。这很混乱,很危险,而且由于 Rails 不是一个单一的进程,而是由你的启动器框架创建的许多进程,例如Passenger,所以你需要在每个进程中都有一个这个对象的实例,这可能会重复工作。

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

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

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

于 2012-05-09T21:20:45.993 回答
0

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

如果是这样,您可以轻松地编写一个守护程序并选择在系统启动时启动它。我会将数据及其当前状态(运行/关闭)放入某种内存存储(Memcache?Redis)或数据库中。您的控制器从那里访问数据。

你也可以让你的控制器直接做类似的事情/etc/init.d/my_service stop/start/restart

如果您要运行许多这些小守护进程,可能在不同的机器上(或由不同的机器管理),我建议您编写一个应用程序来管理它们的状态并通过 RabbitMQ 之类的东西与之通信,但这可能有点过头了你想做。

于 2012-05-09T21:31:38.357 回答
0

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

Redis:http ://redis.io/

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

Redis 是一个缓存服务器,而 resque 是一个建立在它之上的作业调度工具。Resque 有许多与之配合使用的扩展,可让您自定义和扩展其行为。例如:

Resque 还带有一个 Web 用户界面,可让您跟踪所有作业和队列的状态。

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

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

所有这些基础设施在 Heroku 上运行得非常好,也可以使用他们的“Redis-to-Go”插件。我目前将它用于许多任务,并且效果很好。

于 2012-05-09T21:39:01.590 回答