我使用的是Spring JMS,并且有一个@JmsListener
带注释的方法来处理传入的消息,并对它们做出响应。
问题是我需要将传递模式设置为NON_PERSISTENT
,并且使用的IBM MQ库的默认值为PERSISTENT
,只能在调用(内部){{1}时更改方法。
在stackoverflow的另一个问题中,提到可以设置send
的传递模式,但遗憾的是模板不用于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
时,是否有更简单的方法来设置投放模式?我找到了很多可以设置传递模式的类,但是我没有找到任何方法在我必须定义的一个bean上执行此操作以使我的JMS设置运行(如JmsListenerContainerFactory
或{ {1}})。
编辑:不幸的是我们使用的是Spring 4.x,无法更新到5.x
答案 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;
...
}