繁体   English   中英

JRuby的长期对象

[英]JRuby long-lived objects

是否可以在JRuby上运行的Rails应用程序中创建一个Java对象,使其在HTTP调用之间保持“活动”状态?

让我们以一个例子为例,我有一个Counter类(忽略不流行的单例,仅是为了简洁):

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调用之间增加吗?

是的,您应该尝试一下,如果您是在类路径上(例如,在.jar或只是添加到$ CLASSPATH的目录中),则应该:

Java::counter_package::Counter.getInstance.inc

但是我认为您真正的困惑是JRuby上的Rails应用通常如何工作-因为Java(底层平台)具有真实的线程,并且没有GIL ...您将运行一个进程,并且您所有的Ruby类等等都是“生存”-它们不会在请求之间“重新加载”,因此您可以在Ruby中做一个计数器:

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

并将其用作: Counter.instance.inc ,该值将在Counter.instance.inc请求之间保留,直到您重新启动(或进行“热”重新部署)为止

ps虽然要记住的一件事是线程安全性……JRuby有一个技巧使@@var +=以某种方式“原子”(这绝不是原子操作),我建议将原子gem用于真正的原子计数器或围绕此类操作进行synchronize {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM