Задержка доставки сообщения JMS после вызова setRollbackOnly - PullRequest
0 голосов
/ 27 февраля 2019

Я внедряю решение JMS MDB для вызова веб-сервисов, которые будут запускаться из нескольких точек приложения.Ради проверки моего решения я просто передаю Integer объекты прямо сейчас.Я заставляю код пересылать сообщения, когда Integer больше 5.Однако, если сообщение было доставлено дважды, его следует игнорировать / подтверждать.Время ожидания, настроенное в Websphere, составляет 5 минут, а максимальное число неудачных доставок на сообщение - 0 (в разделе Назначение исключений на шинах -> {шина} -> Пункты назначения -> {пункт назначения).

Проблема заключается в том, чтосообщение для объекта 6 отправляется обратно в очередь для повторной доставки через 5 минут, сообщения на 7, 8, 9 ... также удерживаются до тех пор, пока 6 не будет доставлено.Хотя я знаю, что JMS не гарантирует порядок доставки сообщений, но обычно это FIFO.Но как только сообщение отправлено обратно в очередь и доставлено, порядок оставшихся сообщений не является последовательным.то есть это что-то вроде 6, 8, 9, 7. Согласно спецификациям активации JMS Максимальный размер пакета равен 1, а Максимальное число одновременных вызовов MDB для конечной точки равно 10.

Любая идея, как обращаться с новыми сообщениями, которые заблокированы из-засообщение на удержании?Я передал вопрос по этой ссылке, он говорит, что очередь не должна быть заблокирована.

JMS и MDB с setRollbackOnly

Также, пожалуйста, предоставьте предложения по поддержанию порядка сообщений.

Фрагмент кода:

public void onMessage(javax.jms.Message msg) {
    try {
        if (msg instanceof ObjectMessage) {
            ObjectMessage objMsg = (ObjectMessage)msg;
            Object obj = objMsg.getObject();

            UserTransaction userTxn = getMessageDrivenContext().getUserTransaction();
            userTxn.begin();
            InitialContext initialContext = new InitialContext();
            ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("jms/cf");
            javax.jms.Connection conn = cf.createConnection();
            Session jmsSession = conn.createSession(true, -1);
            Queue queue = (Queue) initialContext.lookup("jms/queue1");
            QueueBrowser queueBrowser = jmsSession.createBrowser(queue);
            Enumeration enumeration = queueBrowser.getEnumeration();
            while (enumeration.hasMoreElements()) {
                System.out.println("Browse [" + enumeration.nextElement() + "]");
            }
            if ((Integer)obj >= 6) {
                int count = Integer.valueOf(msg.getStringProperty("JMSXDeliveryCount"));
                if (count > 2) {
                    System.out.println("********** max rollback");
                    userTxn.commit();
                } else {
                    System.out.println("********** rollback");
                    userTxn.setRollbackOnly();
                }
            } else {
                System.out.println("********** commit");
                userTxn.commit();
            }
        } else {
        }
    } catch (Exception ex) {
        ex.printStackTrace();
        throw new EJBException("Transaction failed: " + ex.getMessage());
    } catch (Throwable t) {
    }       
}
...