5

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

  • 使用耙:
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 中,您会生成或妖魔化工作人员,然后使用监视工具来监视 pid。

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

我可以创建一个 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

4

2 回答 2

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只需创建一个config/web.xml.erb文件并将内容复制到它......如果你碰巧使用 Trinidad,在它之上构建了一个扩展(因此您不需要设置 web.xml 并复制 .jar 文件)。

于 2012-10-31T13:05:52.853 回答
0

Usingrake resque:work将启动您的 Rails 环境并启动一个工作人员,该工作人员轮询一项工作,将自己分叉到一个(子)工作进程中,处理该工作然后退出。

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

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

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

于 2011-07-12T02:52:30.267 回答