0

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 つのオプションがあります。

  1. Tomcat 内で実行しますが、別の Java スレッドで実行します。ワーカー プロセスを強制終了して再起動できるようにしたいので、これは避けたいと思います。
  2. コマンド ラインから実行し、起動時に etc/init.d によってそのコマンドが呼び出されるようにします。
  3. 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 環境で実行するにはどうすればよいですか?

4

2 に答える 2

1

別の方法として、 https://github.com/kares/jruby-rack-workerを使用して、(個別の rake プロセスではなく) デーモン スレッドでアプリケーションで Resque を実行することもできます。

jruby-rack-worker gem を含めるようにWarbler (またはGemfile ) を構成するだけです (または、.jar をダウンロードして、それを WEB-INF/lib ディレクトリに配置するように Warbler に指示することもできます)。デプロイメント記述子で Resque をセットアップします。Warbler でconfig/web.xml.erbファイルを作成し、そこに次のコードを配置します。

<!DOCTYPE web-app PUBLIC
  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<% webxml.context_params.each do |k,v| %>
  <context-param>
    <param-name><%= k %></param-name>
    <param-value><%= v %></param-value>
  </context-param>
<% end %>

  <filter>
    <filter-name>RackFilter</filter-name>
    <filter-class>org.jruby.rack.RackFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>RackFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class><%= webxml.servlet_context_listener %></listener-class>
  </listener>

<% if webxml.jndi then [webxml.jndi].flatten.each do |jndi| %>
  <resource-ref>
    <res-ref-name><%= jndi %></res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
<% end; end %>

  <!-- jruby-rack-worker setup using the built-in libraries support : -->

  <context-param>
    <param-name>jruby.worker</param-name>
    <param-value>resque</param-value>
  </context-param>

  <listener>
    <listener-class>org.kares.jruby.rack.WorkerContextListener</listener-class>
  </listener>

</web-app>
于 2012-10-31T16:45:27.957 に答える
0

したがって、これを行うために必要な基本的なことは、小さなシェル スクリプトを作成し、展開された war ファイルの WEB-INF ディレクトリから実行することです。

  1. このスクリプトRakefileと、その他のサポート スクリプト (db/migrations など) が war ファイルに含まれていることを確認してください。
  2. スクリプトは次のようになります。
#!/ビン/バッシュ
#
# WEB-INF/ に入れます。これを rake.sh または任意の名前で呼び出します。

dir=$(ディレクトリ名 $0)

# すべての jar ファイルをクラスパスに入れる   
$dir/* の jar の場合。行う
    CLASSPATH="$jar:$CLASSPATH"
終わり

# Java メモリ設定を調整する必要があるかもしれません。現在、JRuby はデフォルトで 512m を設定しています
JAVA_OPTS=-Xmx512m

# GEM_HOME と GEM_PATH を設定
GEM_HOME=$dir/gems
GEM_PATH=$GEM_HOME

エクスポート CLASSPATH GEM_HOME GEM_PATH

java $JAVA_OPTS org.jruby.Main -S rake $@
于 2012-02-14T17:05:13.637 に答える