多重事务管理器 - 选择一个在运行时 - 春(Multiple transaction manage

2019-10-23 07:09发布

我使用Spring在我的应用程序配置事务。 我有两个RabbitMQ的服务器定义了两个事务管理。

....

@Bean(name = "devtxManager")
public PlatformTransactionManager devtxManager() {
    return new RabbitTransactionManager(devConnectionFactory());
}

@Bean(name = "qatxManager")
public PlatformTransactionManager qatxManager() {
    return new RabbitTransactionManager(qaConnectionFactory());
}

@Bean
public ConnectionFactory devConnectionFactory() {
    CachingConnectionFactory factory = new CachingConnectionFactory();
    factory.setHost(propertyLoader.loadProperty("dev.rabbit.host"));
    factory.setPort(Integer.parseInt(propertyLoader.loadProperty("dev.rabbit.port")));
    factory.setVirtualHost("product");
    factory.setUsername(propertyLoader.loadProperty("dev.sender.rabbit.user"));
    factory.setPassword(propertyLoader.loadProperty("dev.sender.rabbit.password"));
    return factory;
}

@Bean
public ConnectionFactory qaConnectionFactory() {
    CachingConnectionFactory factory = new CachingConnectionFactory();
    factory.setHost(propertyLoader.loadProperty("qa.rabbit.host"));
    factory.setPort(Integer.parseInt(propertyLoader.loadProperty("qa.rabbit.port")));
    factory.setVirtualHost("product");
    factory.setUsername(propertyLoader.loadProperty("qa.sender.rabbit.user"));
    factory.setPassword(propertyLoader.loadProperty("qa.sender.rabbit.password"));
    return factory;
}

...

在我的服务类,我需要通过“ENV”变量通过挑选合适的事务管理器(即,如果ENV ==“质量保证”我需要选择“qatxManager”否则,如果“ENV ==开发”我需要选择“ devtxManager”。

....

@Transactional(value = "qatxManager")
public String requeue(String env, String sourceQueue, String destQueue) {

    // read from queue
    List<Message> messageList = sendReceiveImpl.receive(env, sourceQueue);
....

我怎样才能得到它呢?

Answer 1:

我认为你需要一个门面。 定义一个接口,并创建2类实现相同的接口,但是具有不同@Transactional(value = "qatxManager")

然后定义其保持2个实施方式(使用@Qualifier区分它们)的正面获取一个门面类env适当Bean的字符串和呼叫的方法



文章来源: Multiple transaction managers - Selecting a one at runtime - Spring