Есть приложение на спринг буте. Я хочу написать класс, который будет делать реконнект к 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();
}
.....
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем доброго дня
Как можно сделать противофазу звука с микрофона и воспроизвести через наушники?
Перед мной стоит задача разработать приложение для android, целью которого является подключение android-устройства к raspberryКаким образом организовать...