- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前了解 Java 和 Ruby,但从未使用过 JRuby。我想在 Rack (sinatra) web 应用程序中使用一些 RAM 和计算密集型 Java 代码。特别是,这段 Java 代码将大约 200MB 的数据加载到 RAM 中,并提供了使用这些内存数据进行各种计算的方法。
我知道可以在 JRuby 中从 Ruby 调用 Java 代码,但在我的例子中还有一个额外的要求:该 Java 代码需要加载一次,保存在内存中,并作为共享资源供调用的 sinatra 代码(由多个 Web 请求触发)。
我真的不确定从哪里开始寻找,或者是否有更好的方法来解决这个问题,所以任何和所有建议或相关链接都非常感谢。
最佳答案
是的,一个设置是可行的(参见下面关于部署的内容),为了完成它,我建议使用 Singleton
引用问题:best/most elegant way to share objects between a stack of rack mounted apps/middlewares?我同意 Colin Surprenant的答案,即单例作为模块模式,我更喜欢使用单例混合
我在这里发布了一些测试代码,您可以将其用作概念验证:
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)进行部署。 source: jruby deployments
使用基于 JBoss 应用服务器构建的 TorqueBox。JBoss AS 包括高性能集群、缓存和消息传递功能。
trinidad是一个 RubyGem,允许您在嵌入式 Apache Tomcat 容器中运行任何基于 Rack 的小程序包装
Sinatra 将使用 Mutex#synchronize 方法在每个请求上放置一个锁,以避免线程之间的竞争条件。如果你的 sinatra 应用程序是多线程的并且不是线程安全的,或者你使用的任何 gem 不是线程安全的,你会想要设置 :lock
, true
这样只有一个请求在给定时间处理。 .. 否则默认情况下 lock
为 false
,这意味着 synchronize
将直接让步给 block 。
来源:https://github.com/zhengjia/sinatra-explained/blob/master/app/tutorial_2/tutorial_2.md
关于java - JRuby:从 Rack 应用程序调用 Java 代码并将其保存在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201075/
在 tomcat 内的 jruby/rack 中使用 jruby 时,如何/在哪里为 jruby 设置 --fast 模式? 此 --fast 模式在此页面中进行了说明 jruby performan
任何教程或博客都可以从 JRuby on Rails 开始 哪个指导我安装和小型 JRuby on Rails 应用程序? 我已经浏览了本演练和教程(https://github.com/jruby/
无法使用 jruby 启动 rails5,出现以下错误。 gavinyap@gavin-ubuntu ~/Development/rails5app rails s DEPRECATION W
我制作了一个 NSIS 脚本来为 Rails 应用程序创建安装程序。该应用程序使用 JRuby 和 Java。 在安装程序的第一部分中,我设置了环境变量:我将 jruby\bin 添加到 PATH 并
当我的 jruby 程序意外启动并向我提供堆栈跟踪时,这几乎是不可理解的。它充满了显然来自内部解释器的行,这让我很难弄清楚我的实际程序的实际调用堆栈是什么。 类似的东西(只是摘录): from
如何/在何处为在 jruby-rack/tomcat 中运行的 jruby 设置 --profile.api 选项? 此选项记录在如何分析代码块中 here 最佳答案 使用 JRUBY_OPTS 将无
我无法让 jruby 在没有 hack 的情况下使用 Rails 4: 在 railties/lib/rails/engine.rb 中,我必须用 const_get 初始化 Railties,否则
我需要将我的 JRuby 应用程序编译成一个独立的 JAR 文件。我怎样才能做到这一点? 最佳答案 Warbler 1.3.0 或更新版本也可用于制作可执行 JAR 文件。 快速说明。确保您在此处使用
我正在尝试将 Rails 应用程序转换为 jruby on Rails。目前,jruby script/delayed_job run给出: /usr/lib/jruby/lib/ruby/gems/
我通过在 config/application.rb 中添加了一些外部 jar 到我的 CLASSPATH : require 'java' $CLASSPATH << "#{File.dirname
目前在 Jruby 中编写类似的 java 类时遇到问题。 示例: 在 Java 中: public class Client extends ClientConnection { //do s
jruby 1.7.23 (1.9.3p551) 2015-11-24 f496dd5 在 Java HotSpot(TM) 64 位服务器 VM 1.7.0_79-b15 +jit [Windows
我正在尝试通过最新版本的 Jruby (1.5.1)、Ruby 1.8.7 和 Java 1.6.0_06 执行一些自定义 Java 代码。我已经尝试了类文件并将其放入 jar 方法中。当我尝试 re
文档似乎表明,为了将 Java 类导入到 JRuby 中,它们必须位于 JAR 文件中: “为了使用 JRuby 中的 jar 文件中的资源,jar 文件必须位于类路径上,或者您可以使用 requir
我在 Windows/JRuby 上使用 watir-webdriver。我的开发一直使用 Firefox。 Watir::Browser.new :firefox 对于部署,我需要一个 headle
我正在使用 JRuby 编写 Java 脚本。通过使用 JRebel,我可以自动将更改的 Java 类重新加载到 JRuby JVM 中,而无需重新启动。当我添加一个新的 Java 方法时,JRebe
我试图在 JRuby 中传递一个二进制字符串作为 byte[]通过一些Java库并再次进入JRuby,我想将其转换回字符串,但我无法弄清楚如何在不弄乱字符串的情况下进行操作。 具体来说,我将 Ruby
在Java中运行Ruby脚本时,我们使用ScriptEngine jruby = new ScriptEngineManager().getEngineByName("jruby");,如果只需要调用
当前的 Trinidad gem 依赖于 jruby-rack 1.1.0,它在我的每一项 Assets 的开发日志中显示了一些错误 /Users/bijan/.rvm/gems/jruby-1.7.
环境 JRuby 版本:jruby 9.0.0.0 (2.2.2) 2015-07-21 e10ec96 Java HotSpot(TM) 64 位服务器 VM 25.65-b01,位于 1.8.0_
我是一名优秀的程序员,十分优秀!