【问题标题】:inter jvm communication [closed]jvm间通信[关闭]
【发布时间】:2010-10-23 01:14:49
【问题描述】:

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

【问题讨论】:

    标签: java rpc


    【解决方案1】:

    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

    【讨论】:

    • 对于机器间,我使用来自通信的 JGroups 或套接字,对于内部 JVM,队列工作。我的通信组件中的漏洞是同一台机器上的进程间。
    【解决方案2】:

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

    干杯。

    【讨论】:

    • 我查看了 Terracotta,但它对于这个问题来说是一个非常繁重的解决方案。谢谢
    猜你喜欢
    • 2011-06-30
    • 2010-12-26
    • 2016-09-28
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多