2009-05-01 53 views
7

我正在尋找Java中的進程間通信庫。我期待在JVM之間發送小消息,並且如果可能的話,我希望使用共享內存。inter jvm communication

回答

2

我建議你看看Terracotta。我不知道它是否符合你的要求,因爲Terracotta的主要目標是無縫的可擴展性(「api」只是內存訪問),但它肯定有消息集成模塊。它是開源的。

乾杯。

+0

我看了看兵馬俑,但是它是對於這個問題一個非常沉重的解決方案。 Thx – Javamann 2009-05-01 19:15:33

11

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/a基於內存的文件系統中創建shm.raw文件。這將有助於避免任何磁盤I/O。

欲瞭解更多詳情請閱讀這篇文章Introduction to Memory-Mapped IO in Java

你也仍然需要一種方法來syncronize讀取/寫入共享內存。當一個完整的消息被寫入時,發送者JVM將需要發信號給接收者JVM。

使用Java NIO的SocketChannel對於小消息可能會更好,因爲收到消息時可以通知接收者。共享內存只有在發送大量消息時纔有用。

對於JVM之間IPC在不同機器上嘗試 JIPC

+1

對於機器間,我使用JGroups或來自通信的套接字,並且對於JVM內的隊列起作用。我的通信組件中的孔在同一臺機器上是進程間的。 – Javamann 2009-05-01 08:32:44