2012-09-09 2 views
2

나는 나의 메시지 드리븐 빈에서의 onMessage 방법대기열에서 N 개의 메시지를 수동으로 읽거나, onmessage() 메소드에서 Y 시간이 지난 경우 어떻게 할 수 있습니까?

읽기 N 메시지를 다음과 같은 논리를 구현하거나 첫 발생 후 트랜잭션을 커밋 중 Y 시간을 기다려야 찾고 있습니다.

이 논리를 구현하는 코드 예제를 얻을 수 있다면 정말 고맙겠습니다. 수 있습니다이 코드 같은

T

답변

0

뭔가 당신이 원하는합니다. 청취자를 하나의 단일 소비자로 유지하십시오. 동시 적으로로드 균형이 잡히지 않습니다. 그렇지 않으면 까다로워집니다. 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(); 
} 
+0

Thanks Petter. 하나의 대기열을 수신 대기하도록 구성된 MDB 인스턴스가 여러 개있는 경우이 접근 방식이 작동합니까? 나는 EJB 3.0 사양을 활성화 사양과 함께 사용하고 있습니다. 이 경우 다른 처리 방법이 있습니까? – user1658465

+0

하나의 트랜잭션 범위 내에서이를 달성 할 수는 없습니다. 그런 다음 메시지 그룹과 같은 것을 사용하여 동일한 메시지 그룹의 병렬로 메시지가 소비되지 않도록해야합니다. –

+0

이것은 다소 복잡합니다. 더 높은 수준에서 달성하려는 것은 무엇입니까? 어쨌든 응용 로직에서 이것을 처리하는 것이 더 나을 것입니다. MDB는 좋은면이 있지만 여러 트랜잭션 내의 서로 다른 관리되는 스레드간에 상태를 공유하는 것은 그 중 하나가 아닙니다 –

관련 문제