0

我正在使用 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());
}
4

0 回答 0