Есть приложение на спринг буте. Я хочу написать класс, который будет делать реконнект к 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
В классе 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();
}
.....
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости