2

同じTomcatでJavaWARファイルとJRubyWARファイルを実行するハイブリッドWebアプリケーションがあります。

(JRuby)Resqueをジョブキューとして使用することにしました。ジョブをエンキューするための呼び出しは次のようになります。

Resque.enqueue(FooWorker, 111)

ここで、FooWorkerは、JRuby側で定義および使用される(およびJRuby WARファイルに含まれる)ワーカークラスであり、キューからジョブを処理するときにJRubyResquerakeタスクによって呼び出されます。

FooWorkerJavaコードに、JRubyクラスで処理されるResqueキューにタスクをエンキューする機能を提供したいと思います。

https://github.com/tc/call-jruby-from-java-exampleでTommyChengのコードを確認しました。

//JavaInterfaceExample.java
interface JavaInterfaceExample{
  int add(int a, int b);
}
#JrubyAdderImpl.rb
require 'java'

class JrubyAdderImpl
  include Java::JavaInterfaceExample

  java_signature 'int add(int, int)'
  def add(a, b)
    a+b
  end
end

私のコードは次のようになると思います。

//ResqueInterfaceExample.java
interface ResqueInterfaceExample{
  int resque_enqueue_foojob(int a);
}
#JrubyResqueImpl.rb
require 'java'
require 'resque'

class JrubyResqueImpl
  include Java::ResqueInterfaceExample

  java_signature 'int resque_enqueue_foojob(int)'
  def resque_enqueue_foojob(a)
    Resque.enqueue(FooWorker, a) 
  end
end

FooWorkerのクラスはRailsアプリの展開されたwarファイルディレクトリにあり、ファイルはapp/workers/foo_worker.rb

FooWorkerコードを正しくコンパイルするために、JRubyコンパイラがJRubyクラスとResque JRubyクラスの両方にアクセスできるようにするには、何をする必要がありますか?

4

1 に答える 1

6

Tomcat についてはわかりませんが、Jetty (別のサーブレット コンテナー) を使用すると、jruby コードを jar にコンパイルしてコンテナーの lib ディレクトリに配置できることはわかっています。

または、このプロジェクトをチェックしてください https://github.com/gresrun/jesque

「Jesque は Java での Resque の実装です。Ruby および Node.js (Coffee-Resque) 実装と完全に相互運用可能です。」

Java から resque にジョブをネイティブにエンキューできます。私はそれを使用していませんが、有望に見えます。

于 2012-05-25T01:43:48.480 に答える