2013-04-11 3 views
1

두 개의 서로 다른 JAVA 프로그램간에 원격 메소드 호출 (RMI) 기능이 있어야합니다. 둘 다 주어진 파일 (매개 변수로 파일 이름)에서 백엔드 기능을 순차적으로 수행해야합니다. 처리 할 파일 수가 너무 많을 수 있으므로 원격 호출을 비동기 적으로 수행해야합니다. 처음에는 동 기적으로 호출이 완료된다는 것을 제외하고는 완벽하게 적합하기 때문에 Java RMI를 사용했습니다. 이것들은 단순한 자바 프로그램이며 너무 많은 오버 헤드가 될 수 있으므로 모든 Application Server에 배포하고 싶지 않습니다. 또한 여러 파일을 동시에 실행해야하므로 프로그램이 스레드 안전 모드로 개발됩니다. 이를 위해 이상적인 구현을 제안하십시오. 무료로 제공되는 모든 맞춤 개발 API는 정말 도움이 될 것입니다.자바 비동기 RMI

답변

1

가장 간단한 해결책은 RMI 호출이 비동기 작업을 시작하도록하는 것입니다. 효율성을 높이려면 일괄 처리 파일을 보내 처리 할 수 ​​있습니다. 참고 :주의하지 않으면 디스크 하위 시스템이 병목 현상이 될 수 있으며 여러 스레드를 사용하면 속도가 빨라지는 대신 속도가 느려질 수 있습니다.

0

두 응용 프로그램이 모두 Java이고 (앞으로있을 예정인 경우) JMS (Java Messaging Service)를 사용해야합니다. 비동기 적으로 발생하는 통신은 메시지 대기열 (ActiveMQ 또는 Glassfish 또는 기타와 같은 응용 프로그램 서버에 직접 포함 된 것) 인 타사 브로커가 될 것입니다.

이것을 사용하면 MQ를 보내고 메시지를 다른 응용 프로그램으로 보냅니다.

유연성이 더 필요하고 응용 프로그램 중 일부가 다른 언어로 작성되거나 작성 될 예정이라면 JMS 대신 AMQP를 사용해야합니다.

3

두 개의 서로 다른 JAVA 프로그램간에 원격 메소드 호출 (RMI) 기능이 있어야합니다 ... 원격 호출을 비동기 적으로 수행해야합니다.

이 두 가지 요구 사항은 서로 상반됩니다. RMI는 원격 메서드 호출을 의미하며 호출 및 반환 메서드 호출 의미를 의미합니다. 호출 및 복귀가 아닌 경우 메소드 호출이 아니므로 RMI가 아닙니다.

JMS와 같은 리스너가있는 기술을 조사해야합니다.

+2

실제로 사실이 아닙니다. 비동기 메서드 호출은 일반적으로 반환 값을 처리하기 위해 콜백 또는 다른 형식의 연속을 사용합니다. 그들은 일반적으로 비동기 메시지 전송과 같이 화재와 잊어 버림이 없으며 배우 ​​시스템에서 메시지 전송을 좋아하지 않으므로 명시 적으로 응답을 수신해야합니다. –

+0

@BarryKelly 물론, 그런 기능을 가지고 있지 않은 Java RMI에 관한 질문입니다. – EJP

-1

스레드를 스핀 업하고 스레드에서 메소드를 호출하십시오. 이제 당신은 진정한 비동기 호출을하는 RMI ;-)

2

방법 비동기 것입니다 :

  1. NIO와 RMI를 구현합니다.
  2. 프록시가 호출되면 NIO 선택기에 요청을 넣고 앞으로 결과를 즉시 호출자에게 반환합니다.
  3. 각 요청에는 고유 한 요청 ID가 있어야하며 해당 ID의 응답이 서버에서 도착하면 올바른 미래가 해결되어야합니다.

내가 여기이 실제로 구현하는 방법에 대한 시퀀스 다이어그램과 좋은 explanation입니다 같은 async RMI

알고있는 단 하나의 구현이 있습니다.

0

다음은 비동기 실행을 지원하는 RMI 영역의 또 다른 새로운 플레이어입니다. Redisson 프레임 워크. 비동기 실행에 대한 자세한 설명서는 here입니다.