部署为 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 操作是安全的