뭔가 당신이 원하는합니다. 청취자를 하나의 단일 소비자로 유지하십시오. 동시 적으로로드 균형이 잡히지 않습니다. 그렇지 않으면 까다로워집니다. JEE6을 사용하고 있다면 주석을 통해 jms 리소스를 주입하고 싶을 것입니다. 수신 통화가 없을 경우 Y/N 시간 대기를 차단합니다.
public void onMessage(Message msg) {
// So we got a message, let's grab the JMS resources
// Note that these could be injected as well, for convenience
InitialContext context = new InitialContext();
ConnectionFactory factory = (ConnectionFactory) context.lookup("java:comp/env/jms/connectionFactory");
Destination destination = (Destination) context.lookup("java:comp/env/jms/myQueue");
Connection connection = factory.createConnection();
connection.start();
MessageConsumer consumer = session.createConsumer(destination);
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// TODO: handle msg here
// So, let's start look for msgs.
for (int i=0; i<N; i++) {
Message msg_i = consumer.receive(Y/N);
// Handle msg_i here.
}
consumer.close();
session.close();
connection.close();
}
Thanks Petter. 하나의 대기열을 수신 대기하도록 구성된 MDB 인스턴스가 여러 개있는 경우이 접근 방식이 작동합니까? 나는 EJB 3.0 사양을 활성화 사양과 함께 사용하고 있습니다. 이 경우 다른 처리 방법이 있습니까? – user1658465
하나의 트랜잭션 범위 내에서이를 달성 할 수는 없습니다. 그런 다음 메시지 그룹과 같은 것을 사용하여 동일한 메시지 그룹의 병렬로 메시지가 소비되지 않도록해야합니다. –
이것은 다소 복잡합니다. 더 높은 수준에서 달성하려는 것은 무엇입니까? 어쨌든 응용 로직에서 이것을 처리하는 것이 더 나을 것입니다. MDB는 좋은면이 있지만 여러 트랜잭션 내의 서로 다른 관리되는 스레드간에 상태를 공유하는 것은 그 중 하나가 아닙니다 –