2011-04-28 29 views
5

目前我们在JRuby中使用Resque,并且在开发时我们使用两种方式启动Worker。JRuby中的线程安全Resque Workers部署为WAR时

  • 使用耙:
QUEUE=* jruby -J-cp /path/to/library -S rake environment resque:work
  • 编程,经过初始化的西纳特拉机架应用程序(或其他),最终调用了一类:

def start 
    @worker = Resque::Worker.new(@queues) 
    @worker.verbose = @vervose 
    @worker.work(@interval) 
end 

def stop 
    @worker.try(:shutdown) 
end 

虽然这两个这些解决方案对我们来说是可以接受的。例如,我担心部署到Tomcat时会如何工作。

在Ruby中,通常情况下,你会产生或妖魔化工人,然后使用监视工具来观察PID。

在部署时以编程方式启动Workers是否有意义?我想知道是否它开始在java中的新线程或混乱jruby进程,如果不是我应该使用,但另一个调度库像石英启动一个工人?或在部署任务中启动的rake任务?

我可以创建一个Worker模型,然后让它跟踪db中的工作人员,但这对我没有意义。

任何帮助或知识将不胜感激。

谢谢。

参考文献:

https://github.com/defunkt/resque

http://rubydoc.info/github/defunkt/resque/master/Resque/

http://blog.thomasmango.com/post/636319317/resque-in-production

https://gist.github.com/486161

回答

0

使用rake resque:work将引导您的Rails环境,并开始一个工人,其调查工作的时候,叉本身进入(分)工人进程,处理第在工作,然后退出。

如果你想运行多个工人然后使用COUNT变量:

QUEUE=* COUNT=5 jruby -J-cp /path/to/library -S rake environment resque:work

什么方面的,这将被部署到Tomcat?这是所有的命令行。

+0

如果您的JRuby/Rails应用程序通过WAR文件部署到Tomcat中,您将如何完成这项工作?我是否必须部署2个Tomcat,一个用于“rails server”,一个用于“rake environment resque:work”?如果是这样,怎么样? – 2012-01-31 18:18:26

0

迟了一年多了,但我想你要找的答案是在(本机)Java线程中运行Resque工作器。由于您使用JRuby :: Rack,因此答案为JRuby::Rack::Worker。添加到您的web.xml

<context-param> 
    <param-name>jruby.worker</param-name> 
    <param-value>resque</param-value> 
</context-param> 
<!-- 
<context-param> 
    <param-name>QUEUES</param-name> 
    <param-value>mails,posts</param-value> 
</context-param>--> 

<listener> 
    <listener-class>org.kares.jruby.rack.WorkerContextListener</listener-class> 
</listener> 

如果你啁啾有一个web.xml.erb样品https://github.com/kares/jruby-rack-worker只需创建一个配置/ web.xml.erb文件和复制内容对它...如果您碰巧使用Trinidad,则会在其上创建一个extension(因此您不需要设置web.xml并复制.jar文件)。