java - 如何让 2 个 JVM 相互通信

标签 java ipc concurrent-programming

我有以下情况:

我有 2 个 JVM 进程(实际上是 2 个单独运行的 java 进程,而不是 2 个线程)在本地机器上运行。我们称它们为 ProcessAProcessB

我希望它们相互通信(交换数据)(例如,ProcessAProcessB 发送一条消息以做某事)。

现在,我通过编写一个临时文件来解决这个问题,这些过程会定期扫描这个文件以获取消息。我认为这个解决方案不太好。

实现我想要的更好的选择是什么?

最佳答案

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/

相关文章:

java - 添加两个包含二进制数的字符串

java - 用于抛出客户端特定异常的 JAX RS CXF 拦截器

java - 如何在布局中移动组件?

javascript - <script> require ('renderer.js' ) </script> - 不连接js文件

mysql - 如何将大于 4k 的查询从 SQL 缓冲区发送到 Emacs 中的 sql-mysql 缓冲区?

java - 每当线程达到稳定状态时就发出信号终止它

python - Stackless Python - for 循环中的递归?

java - 按 Enter 键不会选择复选框

c - C 语言的共享内存代码片段

C#/CLR : MemoryBarrier and torn reads