2012-08-13 2 views
2

최근 JMS를 배우기 시작했고 지금까지 몇 가지 개념을 이해했습니다. 그러나 IBM MQ 또는 큐 공급자가 다중 스레드 응용 프로그램의 요청을 처리하는 방법을 알고 싶습니다. 예 :MQ를 사용한 JMS 멀티 스레딩 개념

MQ를 사용하여 메인 프레임 호스트에 메시지를 보내도록 mutithreaded 및 구성된 응용 프로그램을 고려하십시오. 이 응용 프로그램에는 Put 대기열과 get 대기열이 하나씩 있습니다. 호스트에서 데이터를 얻으려는 각각의 요청이 10 개 처리되는 것을 상상해보십시오. 대기열은 단지 하나이므로 모든 10 개의 메시지가 동시에 대기열에 배치됩니다. 호스트는 메시지를 처리하고 클라이언트에 응답을 보냅니다. 답장 메시지가 섞이지 않고 모든 스레드가 올바른 답장 메시지를 얻는 방법은 무엇입니까?

일부 ID는 통신하는 동안 사용되며 특정 메시지 스레드에만 전송됩니까? 새로운 각 실행 스레드에 대해 JMS 세션을 설정해야합니까? 동일한 세션이 10 개의 모든 요청에 ​​사용됩니까? 이 개념을 자세히 설명하는 예제 나 링크를 감사하게 생각합니다.

+1

아마도 http://docs.oracle.com/javaee/5/tutorial/doc/bncdx.html 또는 http://my.execpc.com/~gopalan/jms/jms.html을 읽고 싶을 것입니다. 다른 단어를 사용하여 문서를 설명 할 필요가 없습니다. 그들은 그것이 작동하는 방법을 설명하는 정말 좋은 회로도가 있습니다. ptp 및 psm 메시징 유형에 대해 읽어보십시오. 감사. –

답변

3

JMS 기능은 몇 이것을 지원

가 먼저 JMSCorrelationID로는 응답 요구를 연관시키는 데 사용되는 JMS 헤더이다. 나는. 각 메시지에는 GUID (Globally Unique) JMSMessageId가 있습니다. 메인 프레임 응용 프로그램은 요청의 메시지 ID를 응답 메시지의 JMSCorrelationId로 복사하고 공유 응답 큐로 다시 보내야합니다. 여러 소비자 스레드 (또는 응용 프로그램) 소비자의 선택기입니다 수 있도록

(psuedo code - in one thread, do the following when you need to request data over JMS) 
myMessage = session.createTextMessage("My nice request"); 
messageProducer.send(myMessage); // using some previously setup producer 
// commit if needed 

mc = session.createConsumer(queue,"JMSCorrelationId='"+myMessage.getMessageId()+"'"); 
responseMessage = mc.receive(TIMEOUT); 
if(responseMessage != null){ 
    //got OUR response data 
} 
// close down consumer here. 

트릭 :

그래서 간단하여 요청을 보냅니다. JMS 선택기는 SQL 또는 유사한 쿼리 언어의 하위 집합과 유사합니다. 이 경우 JMSCorrelationId가 요청의 ID와 동일한 시간대로 메시지를 선택하십시오.

이것은 하나의 고정 된 공유 대기열이 있고 요청이 요청 된 바로 그 스레드로 돌아와야한다는 조건으로 할 수있는 유일한 "안전한"설정입니다.

JMS Selector의 오버 헤드를 피하려면 응답마다 임시 대기열을 사용할 수 있습니다. 요청 당 하나의 임시 대기열이 있으면 특정 응답을 수신하는 다른 스레드가 없습니다. 성능을 얻는 또 다른 옵션은 응용 프로그램을 비동기로 만드는 것입니다. JMS는 실제로이를 촉진하고 요청을 해고 소비자 스레드 풀이 비동기 응답을 처리하도록합니다. 각 스레드는 데이터를 처리하고 데이터베이스 (또는 이와 유사한)에 넣는 등 모든 응답을 처리 할 수 ​​있습니다. 나는이 디자인 패러다임이 당신의 사건에 적용 가능한지 모르지만, 적어도 그것에 대해 알고 있어야합니다.