我有以下情况:
我在本地计算机上运行2个JVM进程(实际上是2个java
进程单独运行,而不是2个线程)。我们称它们为ProcessA
和ProcessB
。
我希望他们彼此通信(交换数据)(例如ProcessA
向ProcessB
发送一条消息以执行某项操作)。
现在,我通过编写一个临时文件来解决此问题,并且这些过程会定期扫描此文件以获取消息。我认为这种解决方案不是很好。
什么是实现我想要的更好的选择?
IPC的多个选项:
基于套接字的(裸骨)网络
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方面)。 (正如您在评论中提到“socket很难”,但实际上并非如此,应该由您来解决)
话虽这么说,根据您的示例(仅要求其他进程执行操作),JMX对您也足够好。