Повторная доставка сообщений Websphere MQ

У меня есть Websphere MQ и Java-приложение, получающее от него сообщения. Я хочу создать систему восстановления, если какие-либо исключения будут добавлены в мое приложение. Я использую весенний менеджер транзакций, но проблема в том, что если сообщение вызывает исключение в моем приложении, приложение пытается отправить то же сообщение. Могу ли я положить неработающее сообщение в конец очереди, если было несколько (2,3 и т.д.) неудачных попыток повторной доставки?

вот моя весенняя конфигурация:

<bean id="mqMessageListener" class="ru.mos.notification.controller.MQNotificationListener">
    <property name="mqwsUrl" value="${mqws.url}" />
    <property name="mqwsSoapAction" value="${mqws.soapAction}" />
    <property name="mqwsSoapStart" value="${mqws.soapStart}" />
    <property name="mqwsSoapEnd" value="${mqws.soapEnd}" />
</bean>

<bean id="mqQueueConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <property name="hostName" value="${mq.hostName}" />
    <property name="port" value="${mq.port}" />
    <property name="queueManager" value="${mq.queueManager}" />
    <property name="transportType" value="1" />
    <property name="channel" value="${mq.channel}" />
</bean>

<bean id="jmsConnectionFactory"
    class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
    <property name="targetConnectionFactory" ref="mqQueueConnectionFactory" />
    <property name="username" value="${mq.username}" />
    <property name="password" value="${mq.password}" />
</bean>

<bean
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">       
    <property name="destinationName" value="${mq.destinationName}" />
    <property name="destinationResolver">
        <bean
            class="org.springframework.jms.support.destination.DynamicDestinationResolver" />
    </property>
    <property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE" />
    <property name="sessionTransacted" value="true" />
    <property name="messageListener" ref="mqMessageListener" />
    <property name="transactionManager" ref="transactionManager"/>
    <property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>

вот код метода onMessage:

public void onMessage(Message mess) {
    try {
        if (mess instanceof TextMessage) {
            String m = ((TextMessage) mess).getText();
            logger.info("MQNotificationListener.onMessage TextMessage=" + m);

            Properties prop = new Properties();
            prop.setProperty("SOAPAction", mqwsSoapAction);

            HTTPSend.sendHTTP(mqwsUrl, mqwsSoapStart + m + mqwsSoapEnd,
                    "UTF-8", prop);

            String response = HTTPSend.sendHTTP(mqwsUrl, mqwsSoapStart + m
                    + mqwsSoapEnd, "UTF-8", prop);

            checkResponse(response);

        } else if (mess instanceof BytesMessage) {
            /*
             * byte[] body = new byte[(int) ((BytesMessage)
             * mess).getBodyLength()]; ((BytesMessage)
             * mess).readBytes(body);
             * 
             * String enc = Utils.getProperty(Utils.FP_MIGRATION,
             * "mqrec.encoding");
             * 
             * text = new String(body, enc);
             */
            logger.info("MQMessageListener.onMessage BytesMessage");

        } else {
            logger.info("MQMessageListener.onMessage other");
        }
    } catch (Exception e) {
        logger.error(
                "MQMessageListener.onMessage Exception: " + e.getMessage(),
                e);
        throw JmsUtils.convertJmsAccessException(new JMSException(null));
    }
}

1 ответ

Решение

Очереди работают на основе FIFO, сначала в порядке очереди.

Итак, два варианта

  • в приложении перенаправить сообщение еще куда.
  • чтобы указать приоритет сообщения ниже, а затем убедиться, что потребитель извлекает сообщение в приоритетном порядке.

Оба варианта потребовали бы, чтобы потребитель сотрудничал с производителем.

Другие вопросы по тегам