2014-10-14 2 views
1

КонфигурацияJMS - Redelivery поток в очереди

I'm с помощью EJB 3 в OC4J 10.1.3.x

Проблема

создать производителя очереди с ориентацией CLIENT_ACKNOWLEDGE , например:

queueConnection = queueConnectionFactory.createQueueConnection(); 
    queueSession = queueConnection.createQueueSession(false, 
      Session.CLIENT_ACKNOWLEDGE); 
    queueSender = queueSession.createSender(queue); 

    ObjectMessage objMessage = queueSession.createObjectMessage(); 
    Mail data = new Mail(); 
    data.setMessage("Some random message."); 
    objMessage.setObject(data); 
    queueSender.send(objMessage); 

Что я понимаю, так это то, что потребительский душ d обрабатывать ack сообщения, другими словами, если потребитель НЕ ЗНАЕТ, вызовите метод message.acknowledge(), поэтому сообщение должно быть отправлено повторно. Это правильно?

Что происходит, когда мой MDB просто прочитал сообщение (слушателем onMessage), что сообщение просто выходит из очереди (независимо, если я вызываю или не метод message.acknowledge()).

public void onMessage(Message message) { 
      try { 
       if (message instanceof ObjectMessage) { 
        ObjectMessage objectMessage = (ObjectMessage) message; 
        Mail mail = (Mail) objectMessage.getObject(); 
        System.out.println(mail.getMessage()); 
        throw new RuntimeException("Error"); 
       } 
      } catch (JMSException e) { 
      } 

Что я делаю неправильно?

ответ

0

Ну, я много исследовал об этом, и я обнаружил, что контейнер обычно игнорирует клиентский контроль при создании сеанса. В этом случае: queueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE); Итак, если вам нужно обрабатывать процесс сообщения в MDB с подтверждением или нет, вам нужно работать с транзакцией EJB.

Смежные вопросы