为Spring JmsListener设置DeliveryMode

时间:2018-05-25 10:44:03

标签: java spring jms ibm-mq spring-jms

我使用的是Spring JMS,并且有一个@JmsListener带注释的方法来处理传入的消息,并对它们做出响应。

问题是我需要将传递模式设置为NON_PERSISTENT,并且使用的IBM MQ库的默认值为PERSISTENT,只能在调用(内部){{1}时更改方法。

在stackoverflow的另一个问题中,提到可以设置send的传递模式,但遗憾的是模板不用于JmsTemplate注释方法。

调试后,我发现@JmsListener MessagingMessageListenerAdapterpostProcessProducer方法我可以覆盖手动更改创建的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时,是否有更简单的方法来设置投放模式?我找到了很多可以设置传递模式的类,但是我没有找到任何方法在我必须定义的一个bean上执行此操作以使我的JMS设置运行(如JmsListenerContainerFactory或{ {1}})。

编辑:不幸的是我们使用的是Spring 4.x,无法更新到5.x

1 个答案:

答案 0 :(得分:1)

使用Spring 5(目前为5.​​0.6),您现在可以在容器工厂的QosSettings属性docs here中设置responseQosSettings对象;向下滚动一下。

  

最后,如果您需要为响应指定一些QoS值,例如优先级或生存时间,则可以相应地配置JmsListenerContainerFactory:

public class QosSettings {

    private int deliveryMode;

    private int priority;

    private long timeToLive;

    ...

}