2012-08-31 2 views
4

이 질문은 Websphere MQ (WMQ)를 사용할 때 주로 Websphere Application Server (WAS)에 중점을 둡니다. 그 이유는 이것이 내가 가장 익숙하기 때문입니다. 그러나 Java 표준 인터페이스를 고수하고 있기 때문에 모든 Java EE 응용 프로그램 서버에 더 일반적으로 적용됩니다. 표준과 관련된 설명을 선호하지만 WAS/WMQ와 관련된 답변에 상당히 흥분됩니다.MDB에서 소스 JMS 세션을 가져올 수 있습니까?

JMS 1.1은 JMS가 응용 프로그램 서버와 인터페이스하기위한 메커니즘을 정의합니다. 거친 프로세스는 ConnectionConsumer가 큐 또는 주제를 모니터하기 위해 어느 시점에서 작성된다는 것입니다. 메시지가 표시되면 JMS 구현은 ServerSessionPool에서 ServerSession 객체를 가져 와서 ServerSession과 연결된 Session에 메시지를로드 한 다음 ServerSession 객체에서 start()를 호출합니다. 그런 다음 ServerSession은 응용 프로그램 서버 스레드에서 MDB에 의한 처리를 위해 메시지를 스케줄링합니다. MDB는 메시지를 onMessage() 메소드의 일부로 가져오고 필요한 모든 처리를 수행 할 수 있습니다.

MDB가받은 메시지에 대한 응답으로 다른 메시지를 보내려고 결정하기 전까지는이 모든 것이 좋습니다. 이렇게하기 위해서, MDB는 ConnectionFactory 객체를 검색하거나 삽입하고 Connection을 얻은 다음 Session을 그리고 나서 MessageProducer를 보내고 마지막으로 메시지를 보내야합니다. 이 모든 것은 꽤 낭비적인 것 같습니다. MDB에 메시지를 배달하는 과정에서 Connection 개체와 Session 개체가 이미 만들어졌습니다. MDB가 어떻게 든 세션에 액세스 할 수 있다면, 모든 추가 작업을 수행하지 않아도되고 모든 추가 연결을 만들지 않아도됩니다. 요청 메시지에 회신 메시지를 보내려면 MDB는 두 개의 연결과 두 개의 세션 (메시지를 가져 와서 응답을 보내려면 각각 하나씩)을 사용해야합니다. 글로벌 트랜잭션을 사용하는 경우 응용 프로그램 서버가 트랜잭션을 2 단계 커밋 트랜잭션으로 처리해야한다고 생각합니다 (일부는 아니지만 일부는 응용 프로그램 서버가 하나의 리소스 만 처리하는 글로벌 트랜잭션을 1 단계 확약). 트랜잭션을 2 단계 트랜잭션으로 만들면 메시지 처리 오버 헤드가 크게 증가하고 모든 종류의 새로운 복잡성 (인다 우트 ​​(in-doubt) 트랜잭션이 가장 큰 것 중 하나임)이 도입됩니다.

JMS 1.1 사양에서는 "많은 청취자가 세션의 서비스를 사용해야하므로 청취자는 해당 세션이 생성자 매개 변수로 전달되도록 요구할 가능성이 높습니다." MDB가 응답을 보내기 위해 초기 메시지를 전달한 세션을 사용하기에 완벽하게 허용됩니다. 그러나 표준 방법으로 MDB에서이 Session 개체를 검색하는 메커니즘을 알지 못합니다. 나는 또한 비표준 방식으로 그것을 검색하는 메커니즘을 모르고있다. 나는 심지어 이것에 관한 질문 또는 블로그 포스트를 어디에서도 발견 할 수 없다.

그래서 질문은 : 왜 이런 경우입니까? JMS API는 상당히 복잡하지만 MDB가 원본 메시지를 제공하여 세션에 액세스 할 수 있으면 응답을 보낼 수있는 세션을 MDB에서 사용하는 것이 어렵지는 않습니다. MDB가이 Session 객체를 사용할 수없는 몇 가지 이유가 있습니까? 세션에 액세스하기위한 표준 준수 방법이 있습니까? 비표준 호환 방식이 있습니까? 응용 프로그램 서버/JMS 구현은 단일 JMS 대기열 관리자의 두 연결에 대한 작업과 관련된 글로벌 트랜잭션을 1 단계 커밋 트랜잭션으로 최적화하는 데 적합합니까? (표준에 대한 연구 및 이해가 불가능 함을 나타냄)

+1

와우! 어떻게 이걸 많이 쓸 수 있니? – SiB

+1

오 이런, 들었어. 나는 즉시 대응해야했지만, 나는 모바일에있어 많은 것을 타이핑 할 필요가있다. 내일 대답 할거야. – Nicholas

답변

0

커밋 거래 (내 연구와 표준의 이해을 시사 한 단계로 하나의 JMS 큐 관리자에 두 개의 연결에 대한 작업을 포함하는 글로벌 트랜잭션을 최적화하는 스마트 애플리케이션 서버 /의 JMS 구현 있습니까 이것은 불가능합니다)?

필자의 이해는 다음과 같습니다. JMS는 특별한 종류의 JCA 커넥터입니다. 일반적으로 커넥터에는 물리적 연결과 일치하는 관리 연결 풀이 내부적으로 있습니다. 관리 연결은 한 번에 하나의 트랜잭션에만 참여할 수 있습니다 (트랜잭션은 일시 중지했다가 다시 시작될 수 있으므로 약간 복잡합니다). 어떤 빈을 얻으려면 핸들을 연결하십시오. 빈이 주어진 트랜잭션 내에서 여러 개의 연결 핸들을 얻는다면, 핸들은 분산 된 트랜잭션을 포함해서는 안되는 동일한 관리 연결에 의해 백업됩니다.

물론 커넥터의 구현과 응용 프로그램 서버에 따라 다릅니다. JMS 리소스를 비 XA (there should be an option where you can enable/disable XA support)로 구성하고 MDB에서 메시지를 받고 대기열에 다른 메시지를 보낼 수 있는지 실제로 확인하여 실제로이 작업을 시도 할 수 있습니다. 그것은 작동합니다, 그것은 분산 된 트랜잭션이 관련되어 있지 않다는 것을 의미합니다.

참고 : 일반적인 최적화는 분산 트랜잭션의 참가자 중 하나가 실제로 마지막 참가자로 사용하여 로컬 참가자가 될 수있게하는 "Last Resource Optimization"입니다. 마지막 참여자는 분산 트랜잭션에 속한다는 사실을 전혀 알지 못합니다.

관련 문제