Java Spring: совместимость для транзакционных и нетранзакционных версий mongodb - PullRequest
1 голос
/ 22 апреля 2019

Я использую релиз Spring Boot 2.1.2 (mongodb-driver v 3.8.2) и разрабатываю веб-приложение, которое работает с mongodb. Мое приложение совместимо с версией mongodb 3.4 (эта версия не поддерживает транзакции), и сейчас я внедряю транзакционный механизм. Я аннотирую свой метод обслуживания с помощью транзакционной аннотации

@Transactional
    public void process(Object argument) {
        ...
        ...
        ...
    }

и он отлично работает для mongodb v 4, все работает просто так, как ожидалось - откат неудачных транзакций.

Но когда я запускаю свое приложение с mongodb v 3.4, мое приложение вылетает с

Sessions are not supported by the MongoDB cluster to which this client is connected

исключение.

Проблема в том, что мое приложение должно поддерживать оба случая: транзакционный и нетранзакционный с одним и тем же кодом (для обеих версий mongodb). Вот интересно, как я могу это сделать? Похоже, что мое приложение должно создавать сессию только для конкретной версии Монго, то есть эта аннотация должна обрабатываться только для этого случая.

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Я нашел решение.Spring проверяет наличие PlatformTransactionManager в текущем контексте перед созданием транзакции.Поэтому, если этот бин не определен, сеанс не будет открыт для транзакции.Таким образом, я использовал условный компонент для этой цели в своем классе конфигурации:

    @Bean
    @Autowired
    @ConditionalOnExpression("'${mongo.transactions}'=='enabled'")
    MongoTransactionManager mongoTransactionManager(MongoDbFactory dbFactory) {
        return new MongoTransactionManager(dbFactory);
    }

Таким образом, MongoTransactionManager компонент будет создан только в том случае, если для параметра mongo.transactions установлено значение enable.

1 голос
/ 22 апреля 2019

Не уверен, что это работает, но вы можете попробовать переместить аннотацию @EnableTransactionManagement в новый класс конфигурации, добавить аннотации @Configuration и @Profile("enableTransactions") в класс конфигурации и запустить приложение, используя указанный профиль, когда вам необходимо автоматически настроить управление транзакциями, например, используя:

mvn spring-boot:run -Dspring-boot.run.profiles=enableTransactions

...