Java中可靠的非网络IPC

时间:2009-11-07 20:35:00

标签: java ipc

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

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

过去我通过让服务器在特定端口上侦听127.0.01并且客户端以这种方式进行通信来完成此操作。但是,这并不像我想的那么可靠。某些事情可能会导致这种情况失效(Windows的网络堆栈可能与VPN适配器,MediaSense,笔记本电脑盖关闭/省电模式相差无几)。当用户诊断服务器的工具甚至认为服务器没有运行时,您可以想象用户的困惑。

命名管道看似合理,但Java似乎没有它们的API,除非我弄错了。想法?第三方图书馆支持这个?在有帮助的情况下,我的性能要求显然非常宽松。

5 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:3)

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

  • go low-tech并有后台线程检查文件系统中的文件;从中获取命令;将输出写入一秒钟,由诊断工具拾取。
  • 构建一个组件,管理通过JNI连接到它的共享内存中的输入/输出队列。

答案 2 :(得分:1)

考虑JMX。我不知道是否有任何Windows JVM允许JMX超过共享内存。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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