2009-05-01 8 views
7

Estoy buscando una biblioteca de comunicación entre procesos en Java. Estoy buscando enviar pequeños mensajes entre las JVM y me gustaría hacerlo usando la memoria compartida si pudiera.inter jvm communication

Respuesta

2

Le sugiero que eche un vistazo en Terracotta. No sé si se ajustará a sus requisitos, porque el objetivo principal de Terracotta es la escalabilidad sin problemas ("api" es solo acceso a la memoria), pero ciertamente tiene un módulo de integración de mensajes. Es de código abierto

Saludos.

+0

Miré terracota, pero es una solución muy pesada para este problema. Thx – Javamann

11

Java NIO tiene soporte para archivos mapeados en memoria. Si hay varias JVM que mapean en memoria el mismo archivo, pueden usarlo como memoria compartida.

Aquí hay un ejemplo de mapeo de memoria de un archivo.

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(); } 

En Linux se puede crear el archivo shm.raw en/dev/shm/un sistema de archivos basado en memoria. Esto ayudará a evitar cualquier entrada/salida de disco.

Para más detalles, lea este artículo Introduction to Memory-Mapped IO in Java

también todavía se necesita una manera de sincronizar lectura/escrituras en la memoria compartida. La JVM del remitente deberá indicar la JVM del receptor cuando se haya escrito un mensaje completo.

El uso de SocketChannel de Java NIO puede ser mejor para mensajes pequeños ya que el receptor puede ser notificado cuando se recibe un mensaje. La memoria compartida solo ayudará cuando se envíen mensajes grandes.

para IPC entre las JVM en diferentes máquinas tratan JIPC

+1

Para inter-máquina, estoy usando JGroups o Sockets desde la comunicación y para intra-JVM una cola funciona. El agujero en mi componente de comunicación es entre procesos en la misma máquina. – Javamann