我正在使用 CachingConnectionFactory 为 IBM MQ 缓存我的 JMS 代理连接。即使我抛出显式异常,本地事务下的消息也不会回滚。但是,当我删除缓存并仅使用普通的 JMS 连接工厂时,消息会回滚,以防引发异常。@Gary Russell 指定我们可以简单地抛出异常来回滚事务中的任何消息。 加里的回答
编辑:这是设置我的 JMS 代理的方式:
@Bean
public IntegrationFlow primaryInitiationListenerFlow() {
return IntegrationFlows.from(Jms
.messageDrivenChannelAdapter(
context.getBean("connection" + environment.getProperty("primaryConnection"), ConnectionFactory.class),
DefaultMessageListenerContainer.class)
.autoStartup(false)
.destination(environment.getProperty("sourceName"))
.configureListenerContainer(listenerContainerSpec -> listenerContainerSpec
.destinationResolver((session, destinationName, pubSubDomain) -> destinationName.toUpperCase().endsWith("TOPIC") ?
session.createTopic(destinationName) : session.createQueue(destinationName))
.subscriptionDurable(false))
.id(environment.getProperty("id") + "PrimaryIn")
.get())
.channel("idEnrichmentChannel")
.get();
}
@Bean
public ConnectionFactory connection301() {
MQConnectionFactory factory = new MQConnectionFactory();
try {
factory.setHostName("xxxxxxx");
factory.setPort(1416);
factory.setQueueManager("xxxxxxx");
factory.setChannel("xxxxxxx");
factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
} catch (JMSException e) {
e.printStackTrace();
}
return factory;
}
这是我对 CachingConnectionFactory 的配置:
@Bean
public JmsTemplate template301() {
CachingConnectionFactory cachedConnection = new CachingConnectionFactory();
cachedConnection.setTargetConnectionFactory(connection301());
return new JmsTemplate(cachedConnection);
}
这是 CachingConnectionFactory 的删除后:
@Bean
public JmsTemplate template301() {
return new JmsTemplate(connection301());
}