Повторная доставка сообщений 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, сначала в порядке очереди.
Итак, два варианта
- в приложении перенаправить сообщение еще куда.
- чтобы указать приоритет сообщения ниже, а затем убедиться, что потребитель извлекает сообщение в приоритетном порядке.
Оба варианта потребовали бы, чтобы потребитель сотрудничал с производителем.