当作为WAR部署时,JRbry中的线程安全Resque工作者

5

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

  • 使用Rake:
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中,通常你会生成或者使worker进程后台化,然后使用监控工具来观察pid。
在部署时通过编程方式启动Workers是否有意义?我想知道它是否在Java中启动了一个新线程或者使jruby进程混乱,如果不是,那么我应该使用像quartz这样的调度库来启动Worker吗?还是使用rake任务在部署任务时启动?
我可以创建一个Worker模型,然后让它在数据库中跟踪workers,但这对我来说没有意义。
任何帮助或知识将不胜感激。
谢谢。
参考:

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
超过一年的时间,但我认为你正在寻找的答案是在(本地)Java线程中运行Resque工作程序。由于您正在使用JRuby :: Rack,因此答案是{{link1: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 文件)。


0

使用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 server”,另一个用于“rake环境resque:work”?如果是这样,如何操作? - Jay Godse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接