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"] を出力します。
この Resque Rake タスクを Tomcat/Java 環境 (JRuby がインストールされていない環境) で実行できるようにしたいと考えています。Resque Rake タスクを実行するには 3 つのオプションがあります。
- Tomcat 内で実行しますが、別の Java スレッドで実行します。ワーカー プロセスを強制終了して再起動できるようにしたいので、これは避けたいと思います。
- コマンド ラインから実行し、起動時に etc/init.d によってそのコマンドが呼び出されるようにします。
- Web アプリとは別の Tomcat で実行します。
私のワーブラーは、次のファイルがアプリケーション 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 を使用せずに (WEB-INF/ 内から) Rake タスクを実行する次の方法が見つかりました。
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)'
この時点で、私は完全に途方に暮れています。サーバーに JRuby をインストールせずに、目的の Resque Rake タスクを Java/Tomcat または Java 環境で実行するにはどうすればよいですか?