Spring Boot как добавить соединение с БД в контекст приложения

147
15 июня 2019, 18:30

Есть приложение на спринг буте. Я хочу написать класс, который будет делать реконнект к RethinkDB, если база упала. Я запустил таск, который проверяет, живо ли соединение, и если оно закрыто, то надо создать новое подключение и добавить его в контекст приложения. Класс такой:

package service;
import com.rethinkdb.RethinkDB;
import com.rethinkdb.net.Connection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class RethinkDBReconnector {
    @Autowired
    private RethinkDB r;
    @Autowired
    private Connection conn;
    @Scheduled(fixedRate = 1000)
    public void task() {
        if (!conn.isOpen()) {
            System.out.println("closed");
        }
    }
}

Соединение сконфигурировано так:

@Configuration
public class SpringConfig {
    @Bean
    public Connection connection(RethinkDB r) {
        return r.connection().hostname("127.0.0.1").port(28015).connect();
    }
    @Bean
    public RethinkDB rethinkDB() {
        return RethinkDB.r;
    }
}

Но я не знаю, как получить контекст приложения и добавить в него новое соединение так, чтобы его можно было использовать вместо старого. Не знаю, можно ли его внедрить как зависимость. Скорее всего нет. Как можно решить эту задачу?

Проблема не решена. Присваивание нового значения ссылке в реконнекторе не обновляет соединение глобально.

Попытался сделать так:

@Bean
@Scheduled(fixedRate = 1000)
public Connection connection(RethinkDB r) {
    Connection conn = r.connection().connect();
    if (conn == null || (!conn.isOpen())) {
        conn = r.connection().connect();
    }
    return conn;
}

При запуске возникает исключение:

Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'connection': Only no-arg methods may be annotated with @Scheduled
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.processScheduled(ScheduledAnnotationBeanPostProcessor.java:496)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.lambda$null$1(ScheduledAnnotationBeanPostProcessor.java:359)
    at java.base/java.lang.Iterable.forEach(Iterable.java:75)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.lambda$postProcessAfterInitialization$2(ScheduledAnnotationBeanPostProcessor.java:359)
    at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization(ScheduledAnnotationBeanPostProcessor.java:358)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:434)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1749)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576)
    ... 63 common frames omitted
Answer 1

В классе SpringConfig

.....    
@Autowired
private Connection conn;
@Bean
@Scheduled(fixedRate = 1000)
public Connection connection() {
    if (null != conn && conn.isOpen()) {
        return conn;
    }
    return RethinkDB.r.connection().hostname("127.0.0.1").port(28015).connect();
}
.....
READ ALSO
Как можно сделать противофазу звука с микрофона?

Как можно сделать противофазу звука с микрофона?

Как можно сделать противофазу звука с микрофона и воспроизвести через наушники?

164
Подключение android к Raspberry Pi

Подключение android к Raspberry Pi

Перед мной стоит задача разработать приложение для android, целью которого является подключение android-устройства к raspberryКаким образом организовать...

129