inter jvm communication

时间:2009-05-01 04:40:15

标签: java rpc

我正在寻找Java中的进程间通信库。我希望在JVM之间发送小消息,如果可能,我希望使用共享内存。

2 个答案:

答案 0 :(得分: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.

有关详细信息,请阅读本文Introduction to Memory-Mapped IO in Java

此外,您仍然需要一种方法来同步读取/写入共享内存。发送完整的消息后,发送方JVM将需要向接收方JVM发送信号。

使用Java NIO的SocketChannel可能对小消息更好,因为接收消息时可以通知接收方。共享内存只会在发送大量邮件时提供帮助。

对于不同机器上的JVM之间的IPC尝试 JIPC

答案 1 :(得分:2)

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

干杯。