java - 本地 JVM 之间的通信

标签 java sockets jvm rmi cajo

我的问题:我可以/应该采取什么方法在本地运行的两个或多个 JVM 实例之间进行通信?

问题的一些描述:
我正在为一个项目开发一个系统,该项目需要单独的 JVM 实例来完全隔离某些任务。

在它运行时,“父”JVM 将创建它期望执行的“子”JVM,然后将结果返回给它(以相对简单的 POJO 类的格式,或者可能是结构化的 XML 数据)。不应使用 SysErr/SysOut/SysIn 管道传输这些结果,因为子进程可能已经将它们用作其运行的一部分。

如果子 JVM 在一定时间内没有响应结果,父 JVM 应该能够向子 JVM 发出信号以停止处理,或终止子进程。否则,子 JVM 应该在完成其任务结束时正常退出。

研究至今:
我知道有许多技术可能有用,例如......

  • 使用 Java 的 RMI 库
  • 使用套接字传输对象
  • 使用分发库,例如 Cajo、Hessian

...但我很想听听其他人在选择其中一个或任何其他选项之前可能会考虑哪些方法。

感谢您对此的任何帮助或建议!

修改:
要传输的数据量-相对较小,主要是少数 POJO,其中包含表示子执行结果的字符串。如果任何解决方案在处理大量信息时效率低下,这不太可能在我的系统中成为问题。转移的金额应该是相当静态的,所以这不是必须是可扩展的。

传输延迟-在这种情况下不是一个关键问题,尽管如果需要对结果进行任何“轮询”,这应该能够相当频繁,而不会产生大量开销,因此我可以保持响应稍后在此之上的 GUI(例如进度条)

最佳答案

不是直接回答您的问题,而是对替代方案的建议。 你考虑过OSGI ?

它允许您在同一个 jvm 中完全隔离地运行 java 项目。 它的美妙之处在于项目之间的通信非常容易通过服务进行(参见 Core Specifications PDF 第 123 页)。这样就不会进行任何类型的“序列化”,因为数据和调用都在同一个 jvm 中。

此外,您对服务质量(响应时间等)的所有要求都消失了 - 您只需要担心在您想要使用服务时服务是 UP 还是 DOWN。为此,您有一个非常好的规范,称为声明式服务(参见 Enterprise Spec PDF 第 141 页)

很抱歉这个题外话,但我认为其他人可能会认为这是一个替代方案。

更新

为了回答您关于安全性的问题,我从未考虑过这种情况。我不相信有办法在 OSGI 中强制使用“内存”。

但是,有一种方法可以在 JVM 之外在不同的 OSGI 运行时之间进行通信。它被称为远程服务(参见 Enterprise Spec PDF,第 7 页)。他们还很好地讨论了在做类似事情时要考虑的因素(参见 13.1 谬误)。

Apache Felix 的人(OSGI 的实现)我认为已经用 iPOJO 实现了这个,称为 Distributed Services with iPOJO (他们的包装使使用服务更容易)。我从来没有用过这个 - 如果我错了,请忽略我。

关于java - 本地 JVM 之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5052102/

相关文章:

java - 程序跳过 while 循环 - 没有错误

java - Mockito JUnit 测试抛出异常的方法

c++ - boost::acceptor::cancel 没有按预期工作

oracle - 是否在不安装客户端的情况下检查Oracle监听器是否正在运行?

google-app-engine - 如何使用 GAE 访问 gmail 收件箱

java - 将其他 JVM 语言与 Tomcat servlet 容器一起使用

java - 该类型的方法和构造函数未定义

java - for循环中的异步任务进度条

clojure - 为什么不能在基于 JVM 的 Lisp 中优化尾调用?

java - JUnit 启动时间很慢