Каков наилучший способ доступа к объекту DRb (например, Ruby Queue) из Scala (и Java)? - PullRequest
3 голосов
/ 12 июня 2010

Я создал множество маленьких скриптов, использующих очень простой класс Queue в Ruby, и делю очередь между процессами Ruby и JRuby, используя DRb.Было бы неплохо иметь доступ к ним из Scala (и, возможно, Java) с помощью JRuby.

Я собрал что-то Scala и интерфейс JSR-223 для доступа к 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, но я не объявил интерфейс, потому что он не реализует методы element и peek, потому что класс Ruby их не предлагает.)

Проблема с этим - преобразование типов.JRuby хорошо работает со строками Scala - потому что они являются строками Java.Но если я дам ему Scala Int или Long или один из других типов Scala (List, Set, RichString, Array, Symbol) или какой-то другой пользовательский тип.

Это кажется излишне хакерским: наверняка естьчтобы быть лучшим способом взаимодействия RMI / DRb без использования API-интерфейса JSR-223.Я мог бы либо сделать так, чтобы метод offer сериализировал объект, скажем, в строку JSON, и принимал структурный тип только тех объектов, у которых есть метод toJson.Затем я мог бы написать класс оболочки Ruby (или просто очередь monkeypatch) для анализа JSON.

Есть ли смысл продолжать пытаться получить доступ к DRb из Java / Scala?Может быть, проще установить настоящую очередь сообщений?(Если да, то есть ли какие-нибудь предложения относительно облегченного MQ на основе JVM?)

1 Ответ

2 голосов
/ 01 июля 2010

Стоит установить корпоративную очередь сообщений, потому что DRB и ruby ​​не являются технологией очереди.

По-моему, вы создаете технический долг здесь.

Если вы хотите остаться на том же пути, вы можете использовать очередь Твиттера, от которой они отказались, скворец.

Я думаю, что в мире Java JMS существует множество очередей.

Если бы вы написали DRB-сервер, вам могло бы хватить даже сделать массив, реализующий интерфейс очереди, который очень прост! затем масштабировать соответственно http://www.java -tips.org / Java-SE-советы / java.lang / на основе массивов-очереди реализации, в-java.html

По моему мнению, придерживайтесь проверенных корпоративных технологий, а не хакерских недоказанных, я предпочел трудный путь.

...