JRuby长期存在的物体

时间:2014-08-07 09:02:30

标签: java ruby-on-rails jruby

是否有可能在JRuby上运行的Rails应用程序中创建一个保持" alive"在HTTP调用之间?

让我们举个例子说我有一个班级计数器(忽略不合时宜的单身人士,只是为了简洁):

public class Counter {
    static Counter instance = new Counter();
    static Counter getInstance() {return instance;}
    private int counter;

    public Counter() {
        counter = 0;
    }
    public void inc() {
        counter = counter + 1;
    }
    public int getCounter() {
        return counter;
    }
};

我能以某种方式调用Counter.getInstance()。inc()并期望在HTTP调用之间增加计数器吗?

1 个答案:

答案 0 :(得分:0)

是的 - 你应该尝试一下,如果你的课程在课程路径上(例如在.jar内或只是一个dir添加到$ CLASSPATH中)你会:

Java::counter_package::Counter.getInstance.inc

但我认为你真正困惑的是JRuby上的Rails应用程序通常如何工作 - 因为Java(底层平台)有真正的线程,并且没有GIL ......你将运行一个进程和所有Ruby课程等等#34;长寿" - 他们不会重新加载"在请求之间,所以你可以在Ruby中做一个计数器:

module Counter
  include Singleton
  @@count = 0
  def self.inc; @@count += 1 end
  def self.value; @@count end
end

并将其用作:Counter.instance.inc,并且值将保留在请求之间,直到您重新启动(或执行"热"重新部署)

P.S。要记住的一点是线程安全...... JRuby有一个技巧可以让@@var +=以某种方式使用#13}原子" (它不是原子操作),我建议使用原子宝石作为真正的原子计数器或围绕这些操作进行synchronize {}