gpt4 book ai didi

java - 从 Scala(和 Java)访问 DRb 对象(例如 Ruby 队列)的最佳方式是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:23 25 4
gpt4 key购买 nike

我使用 Ruby 非常简单的 Queue 类构建了各种小脚本,并使用 DRb 在 Ruby 和 JRuby 进程之间共享 Queue。如果能够使用 JRuby 从 Scala(也许还有 Java)访问这些内容,那就太好了。

我已经将一些 Scala 和 JSR-223 接口(interface)放在一起来访问 jruby-complete.jar。

import javax.script._

class DRbQueue(host: String, port: Int) {
private var engine = DRbQueue.factory.getEngineByName("jruby")
private var invoker = engine.asInstanceOf[Invocable]
engine.eval("require \"drb\" ")
private var queue = engine.eval("DRbObject.new(nil, \"druby://" + host + ":" + port.toString + "\")")

def isEmpty(): Boolean = invoker.invokeMethod(this.queue, "empty?").asInstanceOf[Boolean]
def size(): Long = invoker.invokeMethod(this.queue, "length").asInstanceOf[Long]
def threadsWaiting: Long = invoker.invokeMethod(this.queue, "num_waiting").asInstanceOf[Long]
def offer(obj: Any) = invoker.invokeMethod(this.queue, "push", obj.asInstanceOf[java.lang.Object])
def poll(): Any = invoker.invokeMethod(this.queue, "pop")
def clear(): Unit = { invoker.invokeMethod(this.queue, "clear") }
}
object DRbQueue {
var factory = new ScriptEngineManager()
}

(它大致符合 java.util.Queue 接口(interface),但我没有声明接口(interface),因为它没有实现 element 和 peek 方法,因为 Ruby 类没有提供它们。)

问题在于类型转换。 JRuby 可以很好地处理 Scala 的字符串——因为它们是 Java 字符串。但是如果我给它一个 Scala Int 或 Long,或者其他 Scala 类型之一(List、Set、RichString、Array、Symbol)或其他一些自定义类型。

这似乎是不必要的 hacky:肯定有更好的方法来执行 RMI/DRb 互操作,而无需使用 JSR-223 API。我可以这样做,以便 offer 方法将对象序列化为 JSON 字符串,并采用仅具有 toJson 方法的对象的结构类型。然后我可以编写一个 Ruby 包装器类(或只是 monkeypatch 队列)来解析 JSON。

继续尝试从 Java/Scala 访问 DRb 有什么意义吗?安装一个真正的消息队列会不会更容易一些? (如果是这样,对基于 JVM 的轻量级 MQ 有什么建议吗?)

最佳答案

安装企业消息队列是值得的,因为 DRB 和 ruby​​ 不是队列技术。

在我看来,您正在制造技术债务。

如果你想坚持同一条路,你可以使用推特排队他们放弃了八哥。

我认为在 Java 世界 JMS 中有大量可用的队列。

如果您编写了一个 DRB 服务器,您甚至可以编写一个实现队列接口(interface)的数组,这非常简单!然后适当缩放 http://www.java-tips.org/java-se-tips/java.lang/array-based-queue-implementation-in-java.html

在我看来,坚持使用成熟的企业技术,而不是未经证实的骇人听闻的技术,我已经通过艰难的方式学到了这一点。

关于java - 从 Scala(和 Java)访问 DRb 对象(例如 Ruby 队列)的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3029212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com