当部署为WAR时,JRuby中的线程安全Resque Worker

时间:2011-04-28 20:00:38

标签: java tomcat rake jruby resque

目前我们在JRuby中使用Resque,我们在开发时使用两种方式启动Worker。

  • 使用Rake:
QUEUE=* jruby -J-cp /path/to/library -S rake environment resque:work
  • 以编程方式,通过Sinatra Rack App(或其他)初始化,最终通过以下方式调用类:

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

def stop
   @worker.try(:shutdown)
end

虽然这两种解决方案都适合我们开发。我担心在部署到Tomcat时这将如何工作。

在Ruby中,通常会产生或妖魔化工人,然后使用监控工具来监视工具。

部署后以编程方式启动Workers是否有意义?我想知道它是否在java中启动一个新线程或者混乱了jruby进程,如果不是我应该使用,还有另一个像quartz这样的调度库来启动一个worker?或者在部署任务中启动的rake任务?

我可以创建一个Worker模型然后跟踪数据库中的worker,但这对我没有意义。

任何帮助或知识都将受到赞赏。

谢谢。

参考:

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

2 个答案:

答案 0 :(得分:0)

使用rake resque:work将启动您的Rails环境并启动一个工作程序,该工作程序轮询作业,将自己分配到(子)工作进程,处理该作业然后退出。

如果您想运行多个工作人员,请使用COUNT变量:

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

这将部署到Tomcat的哪个方面?这是所有命令行。

答案 1 :(得分:0)

迟了一年多,但我认为你要找的答案是在(本机)Java线程中运行Resque worker和你的应用程序。由于您使用的是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只需创建 config / web.xml.erb 文件并复制内容它...如果您碰巧使用Trinidad,则会在其上构建extension(因此您无需设置web.xml并复制.jar文件)。