当前位置: 首页 > 知识库问答 >
问题:

如何让两个JVM相互对话

王兴腾
2023-03-14

我有以下情况:

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

我希望他们彼此通信(交换数据)(例如,ProcessA向ProcessB发送消息以执行某些操作)。

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

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

共有3个答案

陆敏学
2023-03-14

您需要的是进程间通信。Java以Java RMI API的形式提供了一个简单的IPC框架。还有其他几种进程间通信机制,如管道、套接字、消息队列(显然,这些都是概念,所以有一些框架可以实现这些)。

我认为在您的情况下JavaRMI或简单的自定义套接字实现就足够了。

籍弘伟
2023-03-14

我在github上添加了一个名为Mappedbus的库(http://github.com/caplogic/mappedbus)它允许两个(或更多)Java进程/JVM通过交换消息进行通信。该库使用内存映射文件,并使用fetch和add以及volatile读/写来同步不同的读写器。我已经测量了使用该库的两个进程之间的吞吐量为4000万条消息/秒,读/写单个消息的平均延迟为25纳秒。

闽经纬
2023-03-14

IPC的多个选项:

  • 不一定很难,但:
    • 可能不太详细,
    • 当您编写更多代码时,可能会为bug提供更多的表面
    • 从技术上讲,这也是网络通信,但对你来说是透明的
    • 通常也建立在RMI或网络通信之上,但支持复杂的对话和工作流
    • 对于简单的东西来说可能太重了
    • ActiveMQ或JBoss消息传递等框架
    • 更多用于JVM管理和监控,但如果您主要希望一个进程查询另一个进程的数据,或者向其发送一些操作请求,如果它们不是太复杂,则可以帮助实现您想要的
    • 也适用于RMI(以及其他可能的协议)
    • 一开始并不简单,但实际上使用起来相当简单
    • 这就是你现在正在做的
    • 这是可行的,但是有很多问题要处理
    • 您只需向其他项目发送信号即可
    • 然而,它相当有限,需要您实现一个翻译层(虽然这是可行的,但这是一个相当疯狂的想法,而不是认真的想法)

    如果没有更多细节,基于基本网络的IPC方法似乎是最好的,因为它是:

    • 最具可扩展性(在向您的
    • 最轻量级(就您的应用程序内存占用而言)
    • 最简单(就设计而言)
    • 最有教育意义(在学习如何实现IPC方面)。(正如您在评论中提到的“套接字很难”,它确实不是也应该是您工作的内容)

    也就是说,根据您的示例(只需请求另一个进程执行一个操作),JMX对您来说也足够好了。

 类似资料:
  • 目前,我在一个连接到K8s Redis服务的K8s服务中使用了K8s API Pod,并且使用了它自己的K8s Pod。问题是,我使用NodePort的意思是两个都暴露在公众面前。我只想让公众访问API。问题是,如果我使Redis服务不公开,API就看不到它。有没有一种方法可以将两个服务连接起来,同时又不会将一个服务暴露在公众面前? 这是我的API服务YAML: 这是我的Redis服务YAML:

  • 编辑:为了弄清楚事情,这里有一个例子。如果有五个成员玩一个游戏,那么所有五个成员都将拥有该游戏的外键。另一方面,游戏会有一个外键指向轮到的特定成员。

  • 本文向大家介绍如何判断两个对象相等?相关面试题,主要包含被问及如何判断两个对象相等?时的应答技巧和注意事项,需要的朋友参考一下 提供另一种写法: 当然JSON.stringify(obj)==JSON.stringify(obj)执行速度是最快的

  • 有时候在设计数据结构的时候,可能会遇到两个类需要相互引用的情形。比如类A有类型为B的成员,而类B又有类型为A的成员。 那么这种情形下,两个类的设计上需要注意什么呢? 同一文件 尝试方案 将A和B的定义都放在一个文件中,例如: #include <iostream> class A { public: A() { aa_ = 'A'; } char aa_;

  • 问题内容: 所以,我有两个实体引用对方,。 如果已删除,则必须将其删除,但在仍有引用的情况下不能删除。 这是我得到的两个约束: 我现在要删除一个(和相应的)… 呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜… 是的,我正在尝试删除的血腥条目引用了它… (我知道这是因为上有一个唯一的约束) 看起来如果我将fk设置为,我可以删除该条目,但是这似乎并不是我呼吸的那个家伙想要的,这就是“如果您删除了它,也删除了

  • 问题内容: 有没有人在编写比较两个REST服务的测试方面有任何技巧?我们这样做是作为回归测试的一种形式。 我希望按照以下方式做一些事情: 向两个服务发送“ / 1”的GET并比较结果 向这两个服务发送POST,然后比较结果 向两个服务发送一个PUT,并比较结果 这个想法是: 每个操作都发送到两个服务 结果应该相同 REST服务是用Java / Jersey编写的,因此使用它是理想的,但是人们发现有