はい、セットアップは可能です(展開については以下を参照)。それを達成するには、シングルトンを使用することをお勧めします
Jruby のシングルトン
質問を参照して:ラックにマウントされたアプリ/ミドルウェアのスタック間でオブジェクトを共有するための最良/最もエレガントな方法は? Colin Surprenantの答え、つまり、シングルトン mixin を使用するよりも好む singleton-as-module パターンに同意します
例
ここに、概念実証として使用できるテスト コードをいくつか投稿します。
JRuby シナトラ側:
#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
trinidad
または単にtomcat で起動できますが、次の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 (誰がそんなことをするでしょうか?)、さらには Glassfish、Tomcat、JBoss などの Java 中心のアプリケーション コンテナーを使用してデプロイできます。ソース: jruby デプロイメント
JBoss Application Server 上に構築された TorqueBox を使用します。JBoss AS には、高性能のクラスタリング、キャッシング、およびメッセージング機能が含まれています。
trinidadは、組み込みの Apache Tomcat コンテナ内で任意の Rack ベースのアプレット ラップを実行できるようにする RubyGem です。
スレッド同期
Sinatra は Mutex#synchronize メソッドを使用してすべてのリクエストをロックし、スレッド間の競合状態を回避します。sinatra アプリがマルチスレッドでスレッド セーフでない場合、または使用する gem がスレッド セーフでない場合は、 set を実行し:lock
て、true
一度に 1 つのリクエストのみが処理されるようにする必要があります。.. それ以外の場合、デフォルトlock
はです。これは、が直接ブロックに屈することfalse
を意味します。synchronize
ソース: https://github.com/zhengjia/sinatra-explained/blob/master/app/tutorial_2/tutorial_2.md