Java到JRuby到Resque

Jay*_*dse 1 jrubyonrails resque jruby-java-interop

我有一个混合Web应用程序,它在同一个Tomcat中运行Java WAR文件和JRuby WAR文件.

我们决定使用(JRuby)Resque作为我们的工作队列.对入队作业的调用如下所示:

Resque.enqueue(FooWorker, 111)
Run Code Online (Sandbox Code Playgroud)

其中FooWorker是JRuby端定义并使用的工作类(并包含在JRuby WAR文件中),当JRuby Resque rake任务处理队列中的作业时,它将被调用.

我想让Java代码能够将要由JRuby FooWorker类处理的Resque队列上的任务排队.

我在https://github.com/tc/call-jruby-from-java-example上查看了Tommy Cheng的代码.java文件

//JavaInterfaceExample.java
interface JavaInterfaceExample{
  int add(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)

和ruby文件

#JrubyAdderImpl.rb
require 'java'

class JrubyAdderImpl
    include Java::JavaInterfaceExample

    java_signature 'int add(int, int)'
    def add(a, b)
        a+b
    end
end
Run Code Online (Sandbox Code Playgroud)

我怀疑我的代码看起来像:java文件

//ResqueInterfaceExample.java
interface ResqueInterfaceExample{
  int resque_enqueue_foojob(int a);
}
Run Code Online (Sandbox Code Playgroud)

红宝石文件

#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
Run Code Online (Sandbox Code Playgroud)

我的FooWorker是一个类,它位于rails app的爆炸war文件目录中,文件是app/workers/foo_worker.rb

我需要做些什么来确保jruby编译器可以访问FooWorker和Resque JRuby类来正确编译代码?

tom*_*eng 5

我不确定Tomcat,但我知道Jetty(另一个servlet容器),你可以将jruby代码编译成jar并将它放在容器的lib目录中.

或者查看这个项目https://github.com/gresrun/jesque

"Jesque是Java中Resque的一个实现.它可以与Ruby和Node.js(Coffee-Resque)实现完全互操作."

它允许您将作业本地从java排队到resque.我没有用它,但看起来很有希望.