Java 到 JRuby 到 Resque
我有一个混合 Web 应用程序,它在同一个 Tomcat 中运行 Java WAR 文件和 JRuby WAR 文件。
我们决定使用 (JRuby) Resque 作为我们的作业队列。对排队作业的调用如下所示:
Resque.enqueue(FooWorker, 111)
其中 FooWorker 是 JRuby 端定义和使用的工作器类(并包含在 JRuby WAR 文件中),当 JRuby Resque rake 任务处理来自 JRuby 端的作业时,它由 JRuby Resque rake 任务调用。队列。
我想让 Java 代码能够将任务放入 Resque 队列中,以便由 JRuby FooWorker
类进行处理。
我查看了 Tommy Cheng 的代码 https://github.com/tc /call-jruby-from-java-example。
//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
什么我需要做什么来确保 JRuby 编译器可以访问 FooWorker 和 Resque JRuby 类才能正确编译代码?
I have a hybrid web application which runs a Java WAR file and a JRuby WAR file in the same Tomcat.
We have decided to use (JRuby) Resque as our job queue. The call to enqueue jobs looks like this:
Resque.enqueue(FooWorker, 111)
where FooWorker is a worker class defined on and used by the JRuby side (and included in the JRuby WAR file), and it is invoked by the JRuby Resque rake task when it processes a job from the queue.
I would like to give the Java code the ability to enqueue tasks on the Resque queue to be processed by the JRuby FooWorker
class.
I took a look at Tommy Cheng's code at https://github.com/tc/call-jruby-from-java-example.
//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
I suspect that my code would look like:
//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
class sits in the exploded war file directory for the Rails app, and the file is app/workers/foo_worker.rb
What do I need to do to ensure that the JRuby compiler has access to both the FooWorker
and Resque JRuby classes to compile the code properly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不确定 Tomcat,但我知道使用 Jetty(另一个 servlet 容器),您可以将 jruby 代码编译成 jar 并将其放在容器的 lib 目录中。
或者查看这个项目 https://github.com/gresrun/jesque
“Jesque 是 Resque 的一个实现它与 Ruby 和 Node.js (Coffee-Resque) 实现完全互操作。”
它允许您将作业从 java 本地排队到 resque。我还没有使用过它,但看起来很有希望。
I'm not sure about Tomcat, but I know with Jetty(another servlet container), you can compile the jruby code into a jar and place it in the container's lib directory.
Or check out this project https://github.com/gresrun/jesque
"Jesque is an implementation of Resque in Java. It is fully-interoperable with the Ruby and Node.js (Coffee-Resque) implementations."
It lets you enqueue jobs natively from java to resque. I haven't used it but it looks promising.