Rails Ruby 如何调用 Java 代码

dudu_zzzz · 2016年01月27日 · 最后由 yakjuly 回复于 2016年01月29日 · 4630 次阅读

mac 上在 Rails 里调用一段 Java 程序, 想了想觉得有几种方式

  1. 把 java 程序封装成命令行,ruby 通过命令行调用(调用参数可能是复杂的对象,如何处理?)
  2. 通过 socket 相互访问(对象序列化机制肯定有差异,ruby 序列化的对象,java 里能否反序列化回来?)
  3. soap(不太懂是怎么回事,通过 xml 来交互的?)
  4. java 封装一个 http service(还要开个 tomcat 之类,觉得太重量了)

想问问社区的前辈们应该怎么选择,或者有其他更好的方式?

开个 jetty 提供 http 服务很轻量, 2 秒启动

(曾经用这个开 oracle 数据库的后台) ...

考虑可维护性的话 http+json 或者 rpc 什么的。

以前用过 rjb 去调 poi 可以试试

可以试试 rabbitmq

thrift 感觉可以一试

不是有个 jruby 吗,

如果 java 程序是一个库,可以用 RJB 去调用 java 里面的方法,速度比 命令行快得多。 缺点是可能影响多线程。例如以下程序。

require "rjb"

Rjb::load(File.join(File.dirname(__FILE__), '..', '..', '..', 'ext', 'iText-2.1.4.jar'), ['-Djava.awt.headless=true'])

  def self.itext_merge(filenames, output)
    class_pdfreader     = Rjb::import('com.lowagie.text.pdf.PdfReader')
    class_pdfcopyfields = Rjb::import('com.lowagie.text.pdf.PdfCopyFields')
    class_filestream    = Rjb::import('java.io.FileOutputStream')

    filestream = class_filestream.new(output)
    copy = class_pdfcopyfields.new(filestream)
    failure_list = []

    filenames.each do |f|
      # remove double quote
      if match = /"(.*)"/.match(f)
        f = match[1]
      end

      if File.exists?(f)
        begin
          copy.addDocument(class_pdfreader.new(f))
        rescue => e
          failure_list << f
          Rails.logger.info "PdfMerger: Invalid PDF: #{f}"
        end
      else
        failure_list << f
        Rails.logger.info "PdfMerger: File does not exist: #{f}"
      end
    end
    copy.close()
    # pages = class_pdfreader.new(output).getNumberOfPages

    Rails.logger.info "failed pdf: #{failure_list}" if failure_list.present?
    return failure_list.empty?
  rescue Exception => e
    Rails.logger.info "itext_merge failure: #{e.message}"
    return false
  end
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册