是否有可能在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调用之间增加计数器吗?
答案 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 {}