2009-05-01 7 views
7

Java에서 프로세스 간 통신 라이브러리를 찾고 있습니다. JVM간에 작은 메시지를 보내려하고 있으며 가능한 경우 공유 메모리를 사용하여이를 수행하려고합니다.inter jvm communication

답변

2

Terracotta을 살펴 보시기 바랍니다. 테라코타의 주요 목표는 완벽한 확장 성 ("api"는 메모리 액세스)이지만 사용자 정의 요구 사항에 맞는지 여부는 알 수 없지만 메시징 통합 모듈은 분명히 있습니다. opensource입니다.

건배.

+0

을 시도하지만이 문제에 대한 매우 무거운 솔루션입니다. Thx – Javamann

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/메모리 기반 파일 시스템에서 shm.raw 파일을 만들 수 있습니다. 이렇게하면 디스크 I/O를 피할 수 있습니다. 자세한 내용은

또한 여전히 읽기/공유 메모리에 기록 syncronize 수있는 방법이 필요합니다이 문서 Introduction to Memory-Mapped IO in Java

을 읽어 보시기 바랍니다. 송신자 JVM은 완전한 메시지가 기록 될 때 수신자 JVM에 신호를 보내야합니다.

Java 사용 NIO의 SocketChannel은 메시지 수신시 수신자에게 알릴 수 있기 때문에 작은 메시지의 경우 더 나을 수 있습니다. 공유 메모리는 큰 메시지를 보낼 때만 도움이됩니다. 다른 컴퓨터에서의 JVM 사이의 IPC를 들어

내가 테라코타 보았다 JIPC

+1

inter-machine의 경우 통신에서 JGroups 또는 Sockets를 사용하고 intra-JVM에서는 Queue가 작동합니다. 통신 구성 요소의 구멍은 동일한 기계에서 프로세스 간입니다. – Javamann