Настройка DeliveryMode для Spring JmsListener - PullRequest
0 голосов
/ 25 мая 2018

Я использую 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

1 Ответ

0 голосов
/ 25 мая 2018

В Spring 5 (в настоящее время 5.0.6) вы можете установить объект QosSettings в свойстве responseQosSettings фабрики контейнеров здесь ;прокрутите немного вниз.

Наконец, если вам нужно указать некоторые значения QoS для ответа, такие как приоритет или время жизни, вы можете настроить JmsListenerContainerFactory соответствующим образом:

public class QosSettings {

    private int deliveryMode;

    private int priority;

    private long timeToLive;

    ...

}
...