我有以下情况:
我有 2 个 JVM 进程(实际上是 2 个单独运行的 java
进程,而不是 2 个线程)在本地机器上运行。我们称它们为 ProcessA
和 ProcessB
。
我希望它们相互通信(交换数据)(例如,ProcessA
向 ProcessB
发送一条消息以做某事)。
现在,我通过编写一个临时文件来解决这个问题,这些过程会定期扫描这个文件以获取消息。我认为这个解决方案不太好。
实现我想要的更好的选择是什么?
最佳答案
IPC 的多个选项:
基于套接字(Bare-Bones)的网络
- not necessarily hard , 但:
- 可能不会很冗长,
- 当您编写更多代码时,可能会为错误提供更多表面。
- 您可以依赖现有的框架,例如 Netty
RMI
- 从技术上讲,这也是网络通信,但对您来说是透明的。
成熟的消息传递架构
- 通常也建立在 RMI 或网络通信之上,但支持复杂的对话和工作流
- 对于简单的事情来说可能太重了
- 像 ActiveMQ 这样的框架或 JBoss Messaging
Java Management Extensions (JMX)
- 更多用于 JVM management and monitoring ,但如果您主要希望让一个进程查询另一个进程以获取数据,或者向它发送一些操作请求(如果它们不太复杂),则可以帮助实现您想要的功能
- 也适用于 RMI(以及其他可能的协议(protocol))
- 一开始并不那么简单,但是 actually rather simple to use
文件共享/文件锁定
- 这就是你现在正在做的事情
- 这是可行的,但有很多问题需要处理
信号
- 您可以简单地向您的其他项目发送信号
- 但是,它相当有限,并且需要您实现一个翻译层(虽然它是可行的,但这是一个相当疯狂的想法,而不是任何严肃的事情。
没有更多细节,基于网络的 IPC 方法似乎是最好的,因为它是:
- 最具可扩展性(在向您添加新功能和工作流程方面
- 最轻量级(就您的应用的内存占用而言)
- 最简单(就设计而言)
- 最具教育意义(在学习如何实现 IPC 方面)。 (正如您在评论中提到的“套接字很难”,它确实不是而且应该是您工作的东西)
话虽如此,根据您的示例(只需请求其他进程执行操作),JMX 对您来说也可能足够好。
关于java - 如何让 2 个 JVM 相互通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942427/