Я использую Spring JMS и у меня есть @JmsListener
аннотированный метод, который обрабатывает входящие сообщения, а также отвечает на них.
Проблема заключается в том, что мне нужно установить режим доставки на NON_PERSISTENT
и по умолчаниюиспользуемой библиотеки IBM MQ - PERSISTENT
, которую можно изменить только при вызове (внутреннего) метода send
.
В другом вопросе здесь о stackoverflow было упомянуто, что можно установить доставкурежим JmsTemplate
, но, к сожалению, шаблон не используется для аннотированного метода @JmsListener
.
После отладки я обнаружил MessagingMessageListenerAdapter
, который имеет метод postProcessProducer
, который я могу перезаписать, чтобы вручную изменить настройкииз созданных MessageProducer
.К сожалению, довольно сложно расширить этот класс и позволить Spring использовать его.У меня все получилось, но я сомневаюсь, что это лучшее решение, и, имея это на месте, режим доставки для всех моих @JmsListener
методов будет установлен на NON_PERSISTENT
(пока не проблема для меня, но, возможно, в будущем):
// bean definition in my @Configuration class:
@Bean(name = JmsListenerConfigUtils.JMS_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public JmsListenerAnnotationBeanPostProcessor jmsListenerAnnotationProcessor() {
return new JmsListenerAnnotationBeanPostProcessor() {
@Override
protected MethodJmsListenerEndpoint createMethodJmsListenerEndpoint() {
return new MethodJmsListenerEndpoint() {
@Override
protected MessagingMessageListenerAdapter createMessageListenerInstance() {
return new MessagingMessageListenerAdapter() {
@Override
protected void postProcessProducer(MessageProducer producer, Message response)
throws JMSException {
super.postProcessProducer(producer, response);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
};
}
};
}
};
}
Есть ли более простой способ установить режим доставки при использовании @JmsListener
?Я нашел много классов, в которых я могу установить режим доставки, но я не нашел способа сделать это на одном из компонентов, которые мне нужно было определить, чтобы запустить установку JMS (например, JmsListenerContainerFactory
или ConnectionFactory
).
РЕДАКТИРОВАТЬ: К сожалению, мы используем Spring 4.x и не можем обновить до 5.x