활성 MQ 대기열에서 메시지를 수신하고 있습니다.대기열에서 메시지 수신
한 번에 여러 개의 메시지를받을 수있는 방법이 있습니까? 아니면 루프로 끝내야합니까?
더 자세히 말하자면, 나는 30 개의 메시지가 하나의 프로 시저를 실행한다고 가정하고 그 프로 시저가 작동하는 경우에만 message.acknowledge();
을 반환합니다.
나는 프로 시저가 실패 할 경우 대기열에서 30 개를 지우고 싶지 않습니다.
감사합니다.
활성 MQ 대기열에서 메시지를 수신하고 있습니다.대기열에서 메시지 수신
한 번에 여러 개의 메시지를받을 수있는 방법이 있습니까? 아니면 루프로 끝내야합니까?
더 자세히 말하자면, 나는 30 개의 메시지가 하나의 프로 시저를 실행한다고 가정하고 그 프로 시저가 작동하는 경우에만 message.acknowledge();
을 반환합니다.
나는 프로 시저가 실패 할 경우 대기열에서 30 개를 지우고 싶지 않습니다.
감사합니다.
루프를 반복해야합니다. 일반적으로 메시지를 소비하는 데 메시지 구동 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
}
내가 ActiveMQ를 어떤 경험이 없어 : 따라서, MessageConsumer
및 수동 트랜잭션을 사용합니다. 하지만 큐 리스너의 경우 기본 논리는 큐 구현과 독립적이어야합니다.
첫 번째 질문은 대기열에서 여러 메시지를 가져 오는 방법을 모르겠습니다. 가장 좋은 방법은 하나의 루프 안에서 하나씩 가져 오는 것입니다.
두 번째 질문에 대해서는 메시지를 읽는 기본 트랜잭션이 커밋 될 때까지 메시지가 대기열에서 삭제되지 않습니다. 따라서 단일 트랜잭션에서 모든 메시지를 읽고 오류가 발생하면 롤백 할 수 있습니다. 대기열에서 기존 메시지를 지워서는 안됩니다.
절차를 실행하는 데 왜 30 개의 메시지가 필요한지 묻습니다. 대개 대기열을 사용할 때 각 메시지는 독립적으로 처리 할 수 있어야합니다.
나는 SQL 연결 oprimization에 대한 메신저를 원한다. 나는 데이터베이스에 메시지를 넣고있다. –
Ok. 30 개의 메시지 중 1 개가 형식이 잘못되었습니다. 따라서이 경우 30 개의 메시지를 처리 할 수 없습니다. 이 메세지에 의해 슬로우 된 예외는 30 개의 메세지 모두에 대해 전체 트랜잭션을 롤백하기 때문에. – lash
응용 프로그램에서 메시지의 빈도가 보장됩니까? 그리고 30 초 메시지를받은 29 개의 메시지는 30 번째 메시지를 수신하는 데 2 분이 걸렸습니다 (예 : 네트워크 지연은 예측할 수 없음을 명심하십시오). 처음 29 개 메시지는 2 분 동안 처리되지 않습니다. 이것이 응용 프로그램의 처리량에 영향을 미치지 않습니까? – lash
왜 그 30을 메시지 맵에 넣고 하나의 메시지 맵을 큐에 보냅니 까? 30 개의 메시지가 개별적으로 도착하기를 기다리는 대신 한 번에 처리 할 수 있고 보장 할 수없는 순서를 처리 할 수 있습니다. – dinukadev