2010-12-09 5 views
3

IBM의 WebSphere MQ에 .NET API를 사용하고 있습니다.IBM.WMQ.MQQueue 오브젝트 재사용

MQQueueManager 오브젝트를 생성하는 것은 비용이 많이 드는 작업임이 분명하므로 이러한 오브젝트 풀을 캐시하고 재사용합니다. 한 번 수행

//obtain queueManager from pool 
IBM.WMQ.MQQueue requestQ= queueManager.AccessQueue(requestQName, mqOptions); 
IBM.WMQ.MQQueue responseQ= queueManager.AccessQueue(responseQName, mqOptions); 

그들을 닫습니다 :

현재, 각 요청에 대해, 우리는 필요한 큐에 액세스

requestQ.Close(); 
responseQ.Close(); 

이 최선의 방법인가, 또는 우리는 또한 풀링과 재사용해야한다 MQQueue 객체 (큐 매니저와 함께)? AccessQueue()는 클라이언트에서 값싼 작업으로 보입니다.

답변

1

답변은 스레딩 모델 및 트랜잭션성에 따라 다릅니다. 일반적으로 메시징 클라이언트는 단 단계 커밋 일지라도 항상 트랜잭션 성을 사용해야합니다. 그 이유는 달리 메시지가 중복되거나 손실 될 수있는 결과의 모호성이 있기 때문입니다. 이 in another answer에 대한 자세한 설명을 제공했습니다.

문제는 트랜잭션이 연결 범위라는 것입니다. COMMIT 할 때 전체 연결에 대해 그렇게합니다. 여러 스레드에서 동일한 연결을 사용하면 안전하게 트랜잭션을 사용할 수 없으므로 앱이 분실하거나 중복 된 메시지에 노출 될 수 있습니다. 큐 핸들은 특정 연결 컨텍스트에서만 유효하기 때문에 스레딩 모델과 연결 풀에서 상속됩니다.

서비스 공급자 응용 프로그램의 가장 일반적인 모델은 입력 대기열에서 스레드 당 연결을 유지하고 출력 대기열을 동적으로 열거 나 넣고 닫는 것입니다. 예를 들어, 하나의 작업 단위 ...에

  1. 대상
  2. 열고 얻기 위해 다음 요청 메시지
  3. 사용하여 회신에 대한 정보를 읽고 답장을-하는
  4. 가 넣어 대기 간 응답 큐 응답
  5. 대상 객체에 회신 파괴되므로를 닫고 커밋

이 경우 연결은 지속적으로 재구성되지 않으며 입력 큐가 계속 닫히지 않습니다. 그러나 각 스레드가 전용 연결을 유지해야합니다.

+0

"연결"이라고 말하면 무엇을 의미합니까? IBM docs도 참조하지만 QueueManager에 연결되어 있다고 생각하기 때문에 각 스레드 (캐싱)마다 새 QM을 작성해야하는지 여부는 실제로 이해할 수 없습니다. –

+0

https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html –