跨JVM通信

7

我正在寻找一个Java进程间通信库。我想在JVM之间发送小消息,并希望尽可能使用共享内存进行通信。

2个回答

12
Java NIO支持内存映射文件。如果多个JVM内存映射同一文件,则可以将其用作共享内存。
以下是内存映射文件的示例。
try {
int shmSize = 1024;
RandomAccessFile file = new RandomAccessFile("shm.raw","rw");

// inialize file size
if(file.length() < shmSize) {
  byte[] tmp = new byte[shmSize];
  file.write(tmp);
  file.seek(0); // seek back to start of file.
}

// memory-map file.
FileChannel ch = file.getChannel();
MappedByteBuffer shm = ch.map(FileChannel.MapMode.READ_WRITE, 0, shmSize);
ch.close(); // channel not needed anymore.
shm.load(); // force file into physical memory.

// now use the ByteBuffer's get/put/position methods to read/write the shared memory

} catch(Exception e) { e.printStackTrace(); }

在Linux上,您可以在/dev/shm/中创建shm.raw文件,这是一种基于内存的文件系统。这将有助于避免任何磁盘I/O。
有关更多详细信息,请阅读此文章Java中的内存映射IO入门
另外,您仍需要一种方法来同步读/写共享内存。发送方JVM将需要在完整消息被写入时向接收方JVM发出信号。
对于小消息,使用Java NIO的SocketChannel可能更好,因为接收方可以在接收到消息时得到通知。只有在发送大消息时,共享内存才真正有用。
对于不同机器上的JVM之间的IPC,请尝试JIPC

1
为了进行机器间通信,我使用JGroups或Sockets,而对于JVM内部,队列是有效的。但是我的通信组件中存在的问题是同一台机器上的进程间通信。 - Javamann

2
我建议你看一下Terracotta。我不知道它是否符合你的要求,因为Terracotta的主要目标是无缝扩展(“api”只是内存访问),但它肯定有消息集成模块。它是开源的。
干杯。

我看过Terracotta,但对于这个问题来说它是一个非常笨重的解决方案。谢谢。 - Javamann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接