【问题标题】:Reliable non-network IPC in JavaJava中可靠的非网络IPC
【发布时间】:2009-11-07 20:35:00
【问题描述】:

是否有可靠的跨平台方式在不依赖网络堆栈的 Java (J2SE) 中执行 IPC(在同一主机上运行的两个 JVM 之间)?

更具体地说,我有一个服务器应用程序,我想为其提供一个小型“监控”GUI 应用程序。监视器应用程序将简单地与服务器进程对话并显示简单的状态信息。服务器应用程序的大部分交互都有一个 Web 界面,但有时会出现需要本地控制应用程序的问题(端口冲突、用户忘记密码)。

过去,我通过让服务器在特定端口上侦听 127.0.01 并且客户端以这种方式进行通信来做到这一点。但是,这并不像我想要的那样可靠。某些事情会使这不起作用(Windows 的网络堆栈可能会因 VPN 适配器、MediaSense、笔记本电脑盖关闭/省电模式而变得奇怪)。当用户用来诊断服务器的工具甚至不认为服务器正在运行时,您可以想象用户的困惑。

命名管道似乎是合理的,但 Java 似乎没有针对它们的 API,除非我弄错了。想法?支持这个的第三方库?我的性能要求显然非常宽松,以防万一。

【问题讨论】:

    标签: java ipc


    【解决方案1】:

    我的专长之一是真正的低技术解决方案。特别是如果您的性能要求不重要:

    命名管道的低技术替代品名为 FILES。为自己设想一个协议,一个应用程序写入一个文件,另一个应用程序读取它。如果需要,您可以在它们之间进行信号处理。

    请记住,重命名几乎是一个原子操作,因此您可以从容地在某个进程中编写文件,然后通过从以前不可见的位置重命名/移动它来神奇地完整显示它。

    您可以通过检查文件的外观来轮询数据(在其中包含 SLEEP 的循环中),您可以通过删除文件来表示完成。

    另一个好处是您可以使用 DIR 命令调试您的应用程序:)

    【讨论】:

    【解决方案2】:

    根据您需要在服务器和诊断工具之间传递多少数据,您可以:

    • 降低技术含量,让后台线程检查文件系统中的文件;从中获取命令;将输出写入一秒钟以供诊断工具获取。
    • 构建一个组件,用于管理共享内存中的输入/输出队列,通过 JNI 连接到它。

    【讨论】:

      【解决方案3】:

      考虑 JMX。我不知道是否有任何 Windows JVM 允许 JMX over shared memory。

      【讨论】:

        【解决方案4】:

        Windows 甚至有命名管道吗?我打算建议它。你只需要使用 exec() 来创建它。

        【讨论】:

        • 是的,Windows 有命名管道。我做到了……一次!
        【解决方案5】:

        将 read_write 字节缓冲区从 FileChannel 映射到内存中。将状态信息写入字节缓冲区,然后调用 force() 将其写出。在监视器端,打开同一个文件并将其映射到内存中。定期轮询它以了解状态。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-13
          • 1970-01-01
          • 2012-12-26
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多