Rails Ruby 如何调用 Java 代码

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

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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号