2

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

我们决定使用 (JRuby) Resque 作为我们的作业队列。排队作业的调用如下所示:

Resque.enqueue(FooWorker, 111)

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

我想让 Java 代码能够将任务排入 Resque 队列以由 JRubyFooWorker类处理。

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

//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 应用程序的爆炸式战争文件目录中,该文件是app/workers/foo_worker.rb

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

4

1 回答 1

6

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

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

“Jesque 是 Resque 在 Java 中的实现。它与 Ruby 和 Node.js (Coffee-Resque) 实现完全互操作。”

它使您可以将作业从 java 本地排队到 resque。我没有使用它,但它看起来很有希望。

于 2012-05-25T01:43:48.480 回答