Несколько RedisConnectionFactories в приложении Spring Boot - PullRequest
0 голосов
/ 10 сентября 2018

Мое приложение использует один «основной» экземпляр redis для таких вещей, как хранение сеанса и кэш, но ему нужно общаться с отдельным «внешним» экземпляром по другим причинам. Я пытаюсь определить «лучший» («самый идиоматичный»? «Самый простой»?) Способ настройки этого в моем приложении Spring Boot.

В идеале я бы хотел использовать автоконфигурацию по умолчанию для основного экземпляра, но как только я регистрирую фабрику соединений для внешнего экземпляра, условие @ConditionalOnMissngBean({RedisConnectionFactory.class}) в LettuceConnectionConfiguration становится ложным, поэтому экземпляр по умолчанию isn не создано. Глядя на то, что еще происходит в LettuceConnectionConfiguration и т. Д., Я чувствую, что предпочел бы не настраивать его вручную, если мне это не нужно.

Я мог бы просто не выставлять "внешнюю" фабрику соединений как бин, а использовать ее только для внутреннего создания бинов, которые зависят от нее, но, хотя это было бы нормально в моем конкретном случае, я хотел бы понять, есть ли лучшее решение, где обе фабрики могут быть выставлены.

Есть ли какой-нибудь способ, которым я могу выставить второй RedisConnectionFactory без отключения настройки по умолчанию, предоставляемой автоконфигурацией? Есть ли ясный «правильный путь» для такого рода вещей?

1 Ответ

0 голосов
/ 11 сентября 2018

Вы должны реализовать BeanDefinitionRegistryPostProcessor , чтобы настроить порядок RedisConnectionFactory

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.stereotype.Component;

@Component
public class MultipleRedisConnectionFactoryRegistrar implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        BeanDefinition bd1 = registry.getBeanDefinition("redisConnectionFactory");
        if (bd1 != null) {
            BeanDefinition bd = new RootBeanDefinition(ExternalRedisConnectionFactoryBean.class);
            registry.registerBeanDefinition("externalRedisConnectionFactory", bd);
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }
}

в ExternalRedisConnectionFactoryBean, вы можете создать свой собственный RedisConnectionFactory

import org.springframework.beans.factory.FactoryBean;
import org.springframework.data.redis.connection.RedisConnectionFactory;

public class ExternalRedisConnectionFactoryBean implements FactoryBean<RedisConnectionFactory> {
    @Override
    public RedisConnectionFactory getObject() throws Exception {
        //you can mannually create your external redis connection factory here
        return null;
    }

    @Override
    public Class<?> getObjectType() {
        return RedisConnectionFactory.class;
    }
}

, если хотитеиспользуйте несколько RedisConnectionFactory, вы @ Qualifier - правильный выбор, например

@Autowired
@Qualifier("redisConnectionFactory")
private RedisConnectionFactory defaultRedisConnectionFactory;

@Autowired
@Qualifier("externalRedisConnectionFactory")
private RedisConnectionFactory externalRedisConnectionFactory;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...