2012-06-18 2 views
1

하나의 트랜잭션에 여러 메시지를 사용하여 성능을 향상 시키려고하므로 onMessage 메서드에서 메시지를 사용하려고합니다.MDB의 onMessage 메서드에서 메시지 수동으로 사용

그러나

Message message = consumer.receive(); 

NULL을 반환합니다. 그것은 심지어 차단하지 않습니다. 왜 사는지? 그것이 메시지를 얻을 때까지 차단되어야합니다, 그렇죠?

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void onMessage(Message message) { 

    QueueConnection queueConnection = null;  
    queueConnection = qcf.createQueueConnection(); 
    queueConnection.start(); 
    queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
    Queue queue = queueSession.createQueue(sessionConnParams.toString()); 
    consumer = queueSession.createConsumer(queue); 

    // it works in cycle 
    System.out.println("before receive"); 
    Message message = consumer.receive(); 
    System.out.println("after receive"); 
    if (message == null) { 
     System.out.println("no messages"); 
     return; 
    } 

    // process message 

    } catch (Exception e) { 
    // process exception 
    } finally { 
    // close objects 
    } 
} 
+0

죄송합니다.이 태그를 실수로 추가합니다. – dmiandre

+0

onMessage() 메서드를 호출하는 목적이 메시지를 전달하기 때문에 MDB의 onMessage() 내에서 소비자를 만들고 메시지를받을 특별한 이유가 있습니까? 전화를 다시받는 이유는 무엇입니까? – Shashi

+0

예, 그렇습니다. 성능을 향상시키기 위해 하나의 트랜잭션에서 여러 메시지를 가져와야합니다. 나는 다른 옵션에 대해 몰라. – dmiandre

답변

1

제 의견으로는 onMessage()에 다른 수신기를 만드는 것이 좋습니다. EJB 사양에서는 OnMessage 메서드에서 스레드를 시작하지 않는 것이 좋습니다.

하나의 트랜잭션에서 여러 메시지를 수신해도 성능이 향상되지 않습니다. 성능은 여러 요인에 따라 달라집니다.

1) 메시지 처리 방법은 onMessage입니다.

2) 메시징 공급자가 병렬로 여러 MDB를 실행 고려할 수있는 성능을 향상시키기 위해 메시지

3

)

4 네트워크

) 하드웨어

을 제공하고 얼마나 빨리. 또한 사용중인 메시징 프로 바이더의 성능 조정을보십시오.

는 여기에 당신이 글로벌 트랜잭션으로 실행하는 경우 당신이 원하는 것을 할 JMS를 얻을 가능성이 있다고 생각 IBM

+0

아니요, 메시지 순서를 보존해야하기 때문에 여러 MDB를 사용할 수 없습니다. 그리고 나는 새로운 실을 시작하지 않을 것입니다. – dmiandre

+0

"하나의 트랜잭션으로 여러 개의 메시지를 수신해도 성능이 향상되지 않습니다"- 커밋이 막대한 오버 헤드를 발생시키기 때문에 성능이 크게 향상됩니다. – dmiandre

0

에서 하나 개의 유용한 링크입니다.

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 

을 사용하면 응용 프로그램 서버가 지정되지 않은 트랜잭션 컨텍스트에서 실행됩니다. 이것이 의미하는 바는 사용중인 응용 프로그램 서버에 전적으로 의존합니다. Websphere Application Server를 사용하는 경우, Bean이 트랜잭션 외부에서 실행되므로 메시지 송수신과 같은 조작은 사용자가 기대하는 바를 수행합니다. 다른 응용 프로그램 서버가이를 다르게 처리 할 수 ​​있습니다 - 설명서를 읽으십시오. 어쨌든, 그렇게하는 것은 나쁜 생각 일 수 있습니다. 응용 프로그램 서버에 대해 작업하고 있습니다.

JMS 스펙은 메시지 전달을 일괄 처리하는 메커니즘을 정의합니다. IBM Websphere MQ는이 미리 읽기 (Read-ahead)를 http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=%2Fcom.ibm.mq.csqzaw.doc%2Fjm41130_.htm이라고 부르며 여러 메시지를 한 번에 대기열에서 읽고 응용 프로그램에 차례로 전달할 수 있습니다. 다른 JMS 구현은 아마도 비슷한 것을 지원할 것입니다.

그러나 궁극적으로 응용 프로그램에서 메시지를 항상 순서대로 처리해야하는 경우 다음 메시지를 처리하기 전에 각 메시지를 커밋하는 오버 헤드를 처리해야합니다. 커밋 오버 헤드는 MDB에 메시지를 전달하는 오버 헤드보다 훨씬 큽니다. MDB 내부에서 여분의 메시지를 읽으려고 무언가를 해킹하려고 시도해도 그 문제를 해결할 수는 없습니다. 이것이 당신에게 문제가된다면, 메시지를 순서가 맞지 않게 처리 할 수 ​​있도록 애플리케이션을 변경해야 할 것입니다.

관련 문제