本地JVM之间的通信

obf*_*ion 25 java sockets jvm rmi cajo

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

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

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

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

到目前为止的研究:
我知道有许多技术可能有用,例如......

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

......但我有兴趣听取其他人在追求其中一种选择或其他选择之前可能会考虑的方法.

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

编辑:
要传输的数据量 -相对较小,它主要只是少数包含表示子项执行结果的字符串的POJO.如果任何解决方案在大量信息上效率低下,这在我的系统中不太可能成为问题.正在传输的应该是相当静态的,因此这并没有必须具有可扩展性.

转移的延迟 -在这种情况下不是一个关键问题,尽管如果需要对结果进行任何"轮询",这应该能够相当频繁而没有显着的开销,因此我可以在以后维护响应式GUI(例如进度条)

And*_*yuk 6

不是直接回答你的问题,而是提出替代方案.你考虑过OSGI吗?

它允许您在SAME jvm中彼此完全隔离地运行Java项目.它的美妙之处在于项目之间的通信很容易通过服务进行(参见核心规范PDF第123页).这种方式没有任何类型的"序列化",因为数据和调用都在同一个jvm中.

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

对于非主题回答感到抱歉,但我认为其他人可能会认为这是另一种选择.

更新

要回答有关安全性的问题,我从未考虑过这种情况.我不相信有一种方法可以在OSGI中强制执行"内存"使用.

但是,有一种在不同OSGI运行时之间在JVM之外进行通信的方法.它被称为远程服务(参见企业规范PDF,第7页).他们也很好地讨论了做这样的事情时需要考虑的因素(见13.1谬误).

Apache Felix的人(OSGI的实现)我认为用iPOJO实现了这个功能,称为带有iPOJO的分布式服务(它们的包装器使得使用服务变得更容易).我从来没有用过这个 - 所以如果我错了就不理我.


Chr*_*ett 5

我将KryoNet与本地套接字一起使用,因为它专门用于序列化并且非常轻量级(你也可以使用远程方法调用!我现在正在使用它),但是禁用套接字断开超时.

RMI基本上基于您具有远程类型并且远程类型实现接口的原则.此接口是共享的.在本地计算机上,通过RMI库将接口绑定到RMI库中的"inject"内存代码,结果是您拥有满足接口但能够与远程对象通信的内容.


sup*_*fav 5

akka是另一种选择,以及其他java actor框架,它提供了从actor模型派生的通信和其他好东西.