2012-02-14 8 views
1

私は、同じTomcatでJava WARファイルとJRuby WARファイルを実行するハイブリッドWebアプリケーションを持っています。Java to JRuby to Resque

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

FooWorkerは、上で定義し、JRubyの側で使用(およびJRubyのWARファイルに含まれる)労働者のクラスであり、それはJRubyのResqueのrakeタスクによって呼び出される
Resque.enqueue(FooWorker, 111) 

それはキューからジョブを処理するときです。

JRuby FooWorkerクラスで処理するResqueキューのエンキュー機能をJavaコードに与えたいと思います。

私はhttps://github.com/tc/call-jruby-from-java-exampleでTommy Chengのコードを見ました。 javaファイル

//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 

私は私のコードは次のようになりますことを疑う: javaファイル

//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 

My FooWorkerは、railsアプリケーション用の展開されたwarファイルディレクトリにあるクラスで、ファイルはapp/workers/foo_worker.rbです。

jrubyコンパイラが両方にアクセスできるようにするにはコードを正しくコンパイルするためのFooWorkerとResque JRubyクラス?

答えて

5

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

またはこのプロジェクトをチェックアウトhttps://github.com/gresrun/jesque

"Jesqueは、JavaでResqueの実装です。これは、RubyやNode.jsの(コーヒー-Resque)実装と完全に相互運用が可能です。"

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

+1

優秀!ジェスケを指摘してくれてありがとう –