2012-05-09 120 views
0

我有一個類,創建時,會自動從一系列FTP服務器定期擦破數據庫。它是線程化的,你可以簡單地調用'結果'方法來查看結果。我對Rails相當陌生,但我想爲這個對象創建一個Web界面,以便能夠看到結果,啓動它,停止它,基本上只是與對象進行交互。無論是否有人使用Web界面,我都希望它首先被創建並保持完好,以便它可以在後臺運行並收集數據。我也希望它可以從控制器訪問,以便我可以啓動/停止/信息頁面。任何想法的最佳途徑來實現這一目標?創建Rails中全局對象自動

P.S.我運行的Rails 3.2.3和Ruby 1.9.3

+0

因此您的存儲選項看起來像是:數據庫,遠程存儲(s3),文件系統(本地)和內存。你需要哪些?爲什麼? –

+0

使用redis進行存儲。 –

回答

2

有更好的方法來運行一個後臺進程,並從一個Rails應用程序訪問它,而是直接回答你的問題:

只是把它放在一個初始化。有一個/ config/initializers目錄。將一個.rb文件放在那裏,當你的Rails應用程序啓動時它會自動運行。

/config/initializers/hello.rb:

Rails.logger.debug "Hello World" 

啓動軌道的服務器,你會看到「Hello World」

爲了讓您的類的實例全球可用的只是建立一個全球var:

MYCLASS = MyClass.new 
+0

謝謝。如有必要,我會將其轉換爲Redis,但此Web應用程序很少會在防火牆後面使用,因此安全性和擴展性不是問題。如果tadman說的是真實的,並且有多個實例開始使用,那麼我將不得不尋找更優雅的解決方案,但是要感謝您是直接的。 – hololeap

+0

那麼當有多個Rails實例運行時會發生什麼?你不結束多個進程?雖然如果你通過其他方式調用代碼來啓動一個進程,比如'/etc/init.d/MyThing start' ......就像我在其他地方所建議的那樣。 – David

0

您不應該在Rails應用程序中創建線程。這是混亂的,危險的,因爲Rails不是一個單獨的過程,而是由你的啓動器框架(例如Passenger)創建的一些過程,那麼你將需要在每個過程中有一個這個對象的實例,這可能會重複工作。

更好的辦法是有一個在後臺運行一個單一的過程,但暴露出某種可通過您的各種Rails的情況下使用的API。一種方法是使用像Memcached,Redis這樣的傳統數據庫系統,甚至是平面文件作爲共享存儲系統。另一種方法是直接通過暴露Rails可以使用的接口來響應API調用。制定一個「說memcached」的流程並不困難。

一般最簡單的方法是使用共享存儲來完成這項工作。使用起來很簡單,而且檢查過程是否產生正確的結果更爲容易。例如,使用ActiveRecord將抓取的結果保存到數據庫中,並使用這些相同的模型將數據提取回應用程序中。

你建立到您的Rails應用程序什麼是某種包裝的訪問此共享數據。這可能是一系列ActiveRecord模型,一些Memcached調用或其他,但最終的結果將是一個乾淨的界面,可以在N個進程中獨立運行。

0

嗯。這是在Linux機器上運行嗎?

如果是這樣,你可以隨便寫一個守護&任選具有它啓動系統啓動時。我把數據&可能是它的當前狀態(運行/關閉)到某種內存存儲(Memcache?Redis)或數據庫中。你的控制器從那裏訪問數據。

你也可以有你的控制器做類似/etc/init.d/my_service stop/start/restart直接。

如果你打算有很多運行,有可能對這些小的守護程序(或管理)不同的機器,我建議你寫一個應用程序來管理他們的狀態&通過類似的RabbitMQ與它溝通,但可能對於你想要做的事情來說是過分的。

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'附加組件。我目前將它用於許多任務,並且效果很好。