2010-12-13 5 views
2

JMS 메시지를 대상으로 안전하게 보낼 수 있습니까? 신뢰할 수있는 것은, 예를 들어 MessageProducer.send() 어떤 이유로 호출이 실패하면 자동으로 다시 시도됩니다. 거래 세션에서 최후의 수단으로 .recover()을 사용할 수는 있지만 재 시도하는 것은 어떨까요? 예 : 세션이 설정되고 메시지를 보내려고 시도하는 사이에 간헐적 인 네트워크 오류가 발생했습니다. 이 경우 recover()는 어떻게 도움이 될까요?JMS 메시지를 어떻게 안정적으로 보낼 수 있습니까? (MessageProducer.send() 오류를 페일 오버)

+0

예, JMS는 완전히 트랜잭션이 가능합니다. hows와 whys는 복잡하지만, 당신의 질문은 너무 정교하게 모호합니다. – skaffman

+0

답장을 보내 주셔서 감사합니다! 보다 자세한 답변을 얻으려면 어떤 세부 정보를 제공해야합니까? 나는 '메시지를 안정적으로 전송하는 jms'에 대해 인터넷 검색을하고 있었으며 의미있는 결과를 얻지 못했습니다. 신뢰할 수있는 전송 (생산자에서 목적지로)을 달성하는 방법에 대한 힌트를 줄 수 있습니까? 감사! –

+0

어떤 큐 관리자를 사용하고 있습니까? 어떤 종류의 트랜잭션 관리자 추상화 (예 : jee, spring)? 이식성과 구현 독립성은 강한 요구 사항입니까? – andcoz

답변

1

내가 아는 한 JMS는 이러한 동작을 지원하지 않습니다. 특정 벤더 확장을 검색 할 수는 있지만 IMHO에서는 필요에 맞는 것을 찾지 못할 수도 있습니다.

  1. 그것을 구현 :

    나는 당신의 문제 만이 솔루션을 참조하십시오. JMS 세션을 수동으로 관리하고 예외를 catch하고 필요한 경우 트랜잭션을 무효화하기 위해 트랜잭션 관리자의 "롤백 만 설정"기능을 사용할 수 있습니다.

  2. 로컬 큐를 사용하여 메시지를 저장하고 백그라운드 서비스를 사용하여 메시지를 대상 원격 대기열로 이동합니다. 많은 큐 관리자가이를 지원합니다. Store and forward Queues of ActiveMQ. 물론이 방법으로는 트랜잭션 경계에는 원격 대기열이 포함되지 않습니다.

제 2의 해결책은 당신의 문제에 대한 완전한 해답이 아니라는 것을 알고 있지만, 많은 경우 충분합니다.

1

JMS는 사용자가 원하는 동작을 지정하지 않습니다. 실제로 JMS는 네트워크 오류로 인한 문제를 해결하기 위해 동일한 메시지를 두 번 가져 와서이 메시지를 "기능적으로 중복"메시지라고합니다. 이는 JMS 브로커의 관점에서 볼 때 한 번만 전달 되었기 때문입니다.

이것은 JMS의 일부가 아니기 때문에 다른 벤더 구현에 놓여 있습니다. 예를 들어 WebSphere MQ에는 v7.0.1부터 "다중 인스턴스 대기열 관리자"라는 기능이 있습니다. v7.0.1 클라이언트 응용 프로그램은 자동으로 연결을 재시 도하 고 오류 발생시 1 차 노드에서 2 차 노드로 QMgr를 따라갑니다. 이 문제가 발생하는 동안 응용 프로그램이 차단되고 장애 조치를 인식하지 못합니다.

그러나이 동작을하더라도 앱은 여전히 ​​오류 코드를 작성해야합니다. 예를 들어, WMQ 자동 재 연결 (또는 모든 공급자의 재 연결)을 사용하는 경우 사용자가 무기한 중단을 경험하지 않도록 연결 복구를 기다리는 시간을 조정할 수 있습니다. 호출이 차단 해제되면 트랜잭션이 롤백되고 코드에서 재 시도가 발생해야합니다. 트랜잭션이 더 이상 유효하지 않은 연결과 연관되기 때문에 이것은 적절합니다.