部署为 WAR 时 JRuby 中的线程安全 Resque Workers

Posted

技术标签:

【中文标题】部署为 WAR 时 JRuby 中的线程安全 Resque Workers【英文标题】:Thread Safe Resque Workers in JRuby when deployed as WAR 【发布时间】:2011-08-15 00:28:08 【问题描述】:

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

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

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 进程混乱,如果我不应该使用另一个调度库(如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

【问题讨论】:

【参考方案1】:

晚了一年多,但我认为您正在寻找的答案是在(本机)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,则在其上构建了一个 extension(因此您无需设置 web.xml 并复制 .jar 文件)。

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

如果您的 JRuby/Rails 应用程序通过 WAR 文件部署到 Tomcat 中,您将如何完成这项工作?我是否必须部署 2 个 Tomcat,一个用于“rails 服务器”,一个用于“rake environment resque:work”?如果有,怎么做?

以上是关于部署为 WAR 时 JRuby 中的线程安全 Resque Workers的主要内容,如果未能解决你的问题,请参考以下文章

Windows 安装JRuby 生成 war 到 tomcat 运行

当我使用 run-app 但部署 .war 时,Grails 操作是安全的

Jruby - 创建 jar,没有要加载的文件

部署为 war 文件时如何运行 Play Framework 演变

Tomcat没有自动部署war文件

JRuby 的 Java 安全管理器