多个事务管理器 - 在运行时选择一个 - Spring
Multiple transaction managers - Selecting a one at runtime - Spring
我正在使用 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;
}
...
在我的服务中 class 我需要通过传入的 'env' 变量选择正确的事务管理器。(即如果 env=='qa' 我需要选择 'qatxManager' else if 'env==dev' 我需要选择 'devtxManager'.
....
@Transactional(value = "qatxManager")
public String requeue(String env, String sourceQueue, String destQueue) {
// read from queue
List<Message> messageList = sendReceiveImpl.receive(env, sourceQueue);
....
我怎样才能完成它?
我认为您需要一个 Facade。定义一个接口并创建 2 个 classes 实现相同的接口但具有不同的 @Transactional(value = "qatxManager")
然后定义一个Facadeclass保留2个实现(使用@Qualifier来区分)Facade获取env
字符串和适当bean的调用方法
我正在使用 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;
}
...
在我的服务中 class 我需要通过传入的 'env' 变量选择正确的事务管理器。(即如果 env=='qa' 我需要选择 'qatxManager' else if 'env==dev' 我需要选择 'devtxManager'.
....
@Transactional(value = "qatxManager")
public String requeue(String env, String sourceQueue, String destQueue) {
// read from queue
List<Message> messageList = sendReceiveImpl.receive(env, sourceQueue);
....
我怎样才能完成它?
我认为您需要一个 Facade。定义一个接口并创建 2 个 classes 实现相同的接口但具有不同的 @Transactional(value = "qatxManager")
然后定义一个Facadeclass保留2个实现(使用@Qualifier来区分)Facade获取env
字符串和适当bean的调用方法