Spring自动装配无法解决JRuby脚本依赖性问题

时间:2012-02-15 22:51:59

标签: java spring jruby resque

我正在尝试使用以下示例代码从Java调用Ruby方法:

https://github.com/tc/call-jruby-from-java-example

这是java代码在嵌入式Ruby脚本中的外观:

@Service
public class ProcessorImpl extends RubyObject implements IProcessor {

    private static final Ruby __ruby__ = Ruby.getGlobalRuntime();
    private static final RubyClass __metaclass__;

    static {
         String source = new StringBuilder(
                    "require 'java'\n" +
                    "require 'resque'\n" +
                    "\n" +
                    "class SaveData\n" +
                    "   @queue = :general\n" +
                    "end\n" +
                    "  \n" +
                    "class JRubyResqueImpl\n" +
                    "   include Java::IProcessor\n" +
                    "  \n" +
                    "  java_signature 'void enqueue( Object )'\n" +
                    "   def enqueue( data )\n" +
                    "       Resque.enqueue( SaveData, data )\n" +
                    "   end\n" +
                    "end\n" +
                    "").toString();
         __ruby__.executeScript(source, "JRubyResqueImpl.rb");
        RubyClass metaclass = __ruby__.getClass("JRubyResqueImpl");
        metaclass.setRubyStaticAllocator(ActProcessorImpl.class);
        __metaclass__ = metaclass;
    }


    public ActProcessorImpl(Ruby runtime, RubyClass metaClass) 
    {
        super(runtime, metaClass);
    }

    public static IRubyObject __allocate__(Ruby ruby, RubyClass metaClass) 
    {
        return new ActProcessorImpl(ruby, metaClass);
    }

    public ActProcessorImpl() 
    {
    this(__ruby__, __metaclass__);
    }

    @Override
public void enqueue(Object obj) 
{
    ObjectMapper mapper = new ObjectMapper();
    OutputStream os = new ByteArrayOutputStream();
    try {
        mapper.writeValue(os, obj);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    String json = os.toString();
    IRubyObject rbJson = JavaUtil.convertJavaToRuby(__ruby__, json);
    RuntimeHelpers.invoke(__ruby__.getCurrentContext(), this, "enqueue",rbJson);
}
}

当Spring Framework IoC模块执行自动装配时,它会尝试实例化此类,该类失败并显示以下错误消息:

org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- resque 

当我使用嵌入式Ruby脚本并使用以下命令通过CLI运行它时,我没有看到任何错误:

jruby -S JRubyResqueImpl.rb

JRubyResqueImpl.rb的内容为:

require 'java'
require 'resque'

class SaveData
        @queue = :general
end

class JRubyResqueImpl
        include Java::IProcessor

        java_signature 'void enqueue( Object )'
                def enqueue( data )
                        Resque.enqueue( SaveData, data )
                end
end

我已经配置了环境变量GEM_HOME,GEM_PATH并设置了JRUBY_OPTS = - 1.9。

在Ubuntu 11.10下运行Oracle Java 1.6.0_25,JRuby 1.6.4和Resque 1.19.0。

提前致谢。


我能够通过在嵌入式ruby脚本中显式加载依赖项来取得一些进展,如下所示:

//java code
String source = new StringBuilder(
                    "require 'java'\n" +
                    "load '/usr/local/jruby/jruby-1.6.4/lib/ruby/1.9/singleton.rb'\n" +
                    "load '/usr/local/jruby/jruby-1.6.4/lib/ruby/gems/gems/monitor-0.1.3/lib/monitor/controller.rb'\n" +
                    "load '/usr/local/jruby/jruby-1.6.4/lib/ruby/gems/gems/monitor-0.1.3/lib/monitor.rb'\n" +
                    "load'/usr/local/jruby/jruby-1.6.4/lib/ruby/gems/redis-2.2.2/lib/redis.rb'\n" +
                    "load '/usr/local/jruby/jruby-1.6.4/lib/ruby/gems/redis-namespace-1.0.3/lib/redis-namespace.rb'\n" +
                    "load '/usr/local/jruby/jruby-1.6.4/lib/ruby/gems/resque-1.19.0/lib/resque.rb'\n" +
                    "\n" +
                    etc...

但现在我看到Spring IoC出现以下错误:

org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- singleton

仍然坚持......

0 个答案:

没有答案