是的,它是可能的设置(见下文关于部署),为了完成它,我建议使用单例
Jruby 中的单例
参考问题:在机架安装的应用程序/中间件堆栈之间共享对象的最佳/最优雅的方式?我同意Colin Surprenant的回答,即我更喜欢使用单例 mixin 的单例模块模式
例子
我在这里发布了一些测试代码,您可以将其用作概念证明:
JRuby sinatra 方面:
#file: sample_app.rb
require 'sinatra/base'
require 'java' #https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby
java_import org.rondadev.samples.StatefulCalculator #import you java class here
# singleton-as-module loaded once, kept in memory
module App
module Global extend self
def calc
@calc ||= StatefulCalculator.new
end
end
end
# you could call a method to load data in the statefull java object
App::Global.calc.turn_on
class Sample < Sinatra::Base
get '/' do
"Welcome, calculator register:#{App::Global.calc.display}"
end
get '/add_one' do
"added one to calculator register, new value:#{App::Global.calc.add(1)}"
end
end
您可以在 tomcat 中使用trinidad
或简单地启动它,rackup config.ru
但您需要:
#file: config.ru
root = File.dirname(__FILE__) # => "."
require File.join( root, 'sample_app' ) # => true
run Sample # ..in sample_app.rb ..class Sample < Sinatra::Base
关于 Java 端的一些事情:
package org.rondadev.samples;
public class StatefulCalculator {
private StatelessCalculator calculator;
double register = 0;
public double add(double a) {
register = calculator.add(register, a);
return register;
}
public double display() {
return register;
}
public void clean() {
register = 0;
}
public void turnOff() {
calculator = null;
System.out.println("[StatefulCalculator] Good bye ! ");
}
public void turnOn() {
calculator = new StatelessCalculator();
System.out.println("[StatefulCalculator] Welcome !");
}
}
请注意,register
这里只是一个double
,但在您的真实代码中,您可以在真实场景中拥有大数据结构
部署
您可以使用 Mongrel、Thin(实验性)、Webrick(但谁会这样做?)甚至以 Java 为中心的应用程序容器(如 Glassfish、Tomcat 或 JBoss)进行部署。来源:jruby 部署
使用构建在 JBoss 应用服务器上的 TorqueBox。JBoss AS 包括高性能集群、缓存和消息传递功能。
trinidad是一个 RubyGem,它允许您在嵌入式 Apache Tomcat 容器中运行任何基于 Rack 的小程序包装
线程同步
Sinatra 将使用 Mutex#synchronize 方法在每个请求上放置一个锁,以避免线程之间的竞争条件。如果您的 sinatra 应用程序是多线程的并且不是线程安全的,或者您使用的任何 gem 都不是线程安全的,您会想要执行 set :lock
,true
以便在给定时间只处理一个请求。.. 否则默认lock
为false
,这意味着synchronize
将直接屈服于块。
来源:https ://github.com/zhengjia/sinatra-explained/blob/master/app/tutorial_2/tutorial_2.md