2012-11-28 7 views
0

활성 MQ 대기열에서 메시지를 수신하고 있습니다.대기열에서 메시지 수신

한 번에 여러 개의 메시지를받을 수있는 방법이 있습니까? 아니면 루프로 끝내야합니까?

더 자세히 말하자면, 나는 30 개의 메시지가 하나의 프로 시저를 실행한다고 가정하고 그 프로 시저가 작동하는 경우에만 message.acknowledge();을 반환합니다.

나는 프로 시저가 실패 할 경우 대기열에서 30 개를 지우고 싶지 않습니다.

감사합니다.

+0

왜 그 30을 메시지 맵에 넣고 하나의 메시지 맵을 큐에 보냅니 까? 30 개의 메시지가 개별적으로 도착하기를 기다리는 대신 한 번에 처리 할 수 ​​있고 보장 할 수없는 순서를 처리 할 수 ​​있습니다. – dinukadev

답변

2

루프를 반복해야합니다. 일반적으로 메시지를 소비하는 데 메시지 구동 Bean을 사용하는 것이 가장 좋지만 메시지로 메시지를 가져오고 정확한 번호를 지정할 수 없기 때문에이 경우 적합하지 않습니다.

@Resource 
UserTransaction utx; 

@Resource(mappedName="jms/yourConnectionFactory"); 
ConnectionFactory cf; 

@Resource(mappedName="jms/yourQueue"); 
Queue queue; 

..  
Connection conn = null; 
Session s = null; 
MessageConsumer mc = null; 
try { 
    utx.begin(); 
    conn = cf.createConnection(); 
    s = conn.createSession(true, Session.CLIENT_ACKNOWLEDGE); //TRANSACTIONAL SESSION! 
    mc = s.createConsumer(queue); 
    conn.start(); // START CONNECTION'S DELIVERY OF INCOMING MESSAGES 
    for(int i=0; i<30; i++) 
    { 
      Message msg = mc.receive(); 
      //BUSINESS LOGIC 
    } 
    utx.commit(); 
} catch(Exception ex) { 
    .. 
} finally { //CLOSE CONNECTION, SESSION AND MESSAGE CONSUMER 
} 
0

내가 ActiveMQ를 어떤 경험이 없어 : 따라서, MessageConsumer 및 수동 트랜잭션을 사용합니다. 하지만 큐 리스너의 경우 기본 논리는 큐 구현과 독립적이어야합니다.

첫 번째 질문은 대기열에서 여러 메시지를 가져 오는 방법을 모르겠습니다. 가장 좋은 방법은 하나의 루프 안에서 하나씩 가져 오는 것입니다.

두 번째 질문에 대해서는 메시지를 읽는 기본 트랜잭션이 커밋 될 때까지 메시지가 대기열에서 삭제되지 않습니다. 따라서 단일 트랜잭션에서 모든 메시지를 읽고 오류가 발생하면 롤백 할 수 있습니다. 대기열에서 기존 메시지를 지워서는 안됩니다.

절차를 실행하는 데 왜 30 개의 메시지가 필요한지 묻습니다. 대개 대기열을 사용할 때 각 메시지는 독립적으로 처리 할 수 ​​있어야합니다.

+0

나는 SQL 연결 oprimization에 대한 메신저를 원한다. 나는 데이터베이스에 메시지를 넣고있다. –

+0

Ok. 30 개의 메시지 중 1 개가 형식이 잘못되었습니다. 따라서이 경우 30 개의 메시지를 처리 ​​할 수 ​​없습니다. 이 메세지에 의해 슬로우 된 예외는 30 개의 메세지 모두에 대해 전체 트랜잭션을 롤백하기 때문에. – lash

+0

응용 프로그램에서 메시지의 빈도가 보장됩니까? 그리고 30 초 메시지를받은 29 개의 메시지는 30 번째 메시지를 수신하는 데 2 ​​분이 걸렸습니다 (예 : 네트워크 지연은 예측할 수 없음을 명심하십시오). 처음 29 개 메시지는 2 분 동안 처리되지 않습니다. 이것이 응용 프로그램의 처리량에 영향을 미치지 않습니까? – lash

관련 문제