我有一个 JRuby/Rails Web 应用程序。我使用 rbenv 和 JRuby 在本地进行测试(使用“rails 服务器”),它可以工作。我还将生产版本作为 WAR 文件分发并在 Tomcat 中运行,并且该机器没有安装 JRuby。有用。我现在需要能够使用 Resque 和 Redis 来处理长时间运行的作业。我在本地安装了 Resque/redis 并从命令行运行 Resque
linux> "QUEUE=* bundle exec rake environment resque:work
有用。我创建了一个小工人类(FooClass),它只打印出参数,由 Resque 调用,我可以通过运行将请求排入队列
irb(main):041:0>Resque.enqueue(FooWorker, [1,"4"])
在 Rails 控制台中,Resque 最终处理请求并打印 [1,"4"]
我希望能够在 Tomcat/Java 环境(没有安装 JRuby)中运行这个 Resque Rake 任务,并且我有 3 个选项来运行 Resque Rake 任务。
- 在 Tomcat 中运行它,但在一个单独的 Java 线程中。我不想这样做,因为我希望能够杀死工作进程并重新启动它。
- 从命令行运行它,并让 etc/init.d 在启动时调用该命令。
- 在与 Web 应用程序不同的 Tomcat 中运行它。
我的 warbler 配置为应用程序 WAR 文件中存在以下文件,并在 Tomcat 启动应用程序时分解为 webapps/WEB-INF 到 webapps/abc/WEB-INF。
Gemfile
Rakefile
web.xml
lib/jruby-core-1.6.4.jar
lib/jruby-rack-1.0.10.jar
lib/jruby-stdlib-1.6.4.jar
lib/tasks/abc.rake
lib/tasks/resque.rake
gems/gems/bundler-1.0.21
gems/gems/warbler-1.3.2
gems/gems/rails-3.0.10
(other gem files in gems/gems)
config/warble.rb
文件 config/warble.rb 如下所示:
Warble::Config.new do |config|
config.dirs=%w{app config lib lob vendor tmp}
config.includes=FileList["./Rakefile"]
config.webxml.jruby.compat.version = "1.9"
end
文件 lib/tasks/resque.rake 有
require "resque/tasks"
task "resque:setup" => :environment
task "resque:work" => :environment
我的 gemfile 包括以下几行:
source 'http://rubygems.org'
gem 'bundler', '1.0.21'
gem 'rails', '3.0.10'
gem 'rake', '0.8.7'
gem 'resque'
在 Web 上搜索产生了以下在不使用 JRuby 的情况下运行 Rake 任务的方法(从 WEB-INF/ 中):
linux> java -cp lib/jruby-core-1.6.4.jar -S rake
结果是
Unrecognized option: -S
Could not create the Java virtual machine
只是为了好玩,我试过了
linux> java -jar lib/jruby-core-1.6.4.jar -S rake
结果是
jruby: No such file or directory -- rake (LoadError)
然后我尝试将 jruby-complete-1.6.4 下载到该目录并运行
linux> java -jar lib/jruby-complete-1.6.4.jar -S rake -T
(in /WEB-INF)
rake aborted!
no such file to load -- bundler/setup
/WEB-INF/Rakefile:4:in `(root)'
在这一点上,我完全不知所措。如何在 Java/Tomcat 或仅 Java 环境中运行我想要的 Resque Rake 任务而不在该服务器上安装 JRuby?