Проблема в следующем:
- используется внутри статических блоков некоторых классов.
Код: Выделить всё
nodeId - Одним из этих классов является DeploymentConfig.
- загружается до полной инициализации контекста Spring.
Код: Выделить всё
DeploymentConfig - Поэтому я не могу нормально внедрить bean-компоненты Spring.
В ApplicationConfig У меня есть:
Код: Выделить всё
public static String getNodeId() {
if (nodeId == null) {
setNodeId();
}
return nodeId;
}
public static synchronized void setNodeId() {
logger.info("Start setNodeId");
try {
if (nodeId == null) {
nodeId = NodeRegistryHolder.getNodeRegistry().getSerial().toString();
// nodeId = SpringContext.getBean(INodeRegistryService.class)
// .getNodeRegistry().getName();
}
} catch (Throwable e) {
logger.error(e, e);
} finally {
logger.info("End setNodeId, nodeId = {}", nodeId);
}
}
Служба, которую необходимо вызвать
Мне нужно вызвать RegisterNode() из этой службы Spring:
Код: Выделить всё
@Service
public class NodeRegistryServiceImpl implements INodeRegistryService {
@CachePut("node-id")
@Override
public NodeRegistryDTO registerNode() throws BusinessException, DBException {
String IP = GlobalUtil.getMachineIP();
...
NodeRegistry nodeRegistry = nodeRegistryRepository.registerNode(session, IP);
...
return nodeRegistry.getDataTransferObject();
}
}
- IP является динамическим (среда Kubernetes), поэтому мы должны зарегистрировать узел во время выполнения.
- Нам нужен стабильный логический идентификатор узла.
- должен вызываться перед любыми статическими блоками, использующими nodeId.
Код: Выделить всё
registerNode()
Код: Выделить всё
@DependsOnКод: Выделить всё
ApplicationContextInitializer- Инъекция бобов
Код: Выделить всё
BeanPostProcessor- Вручную SpringContext.getBean(...)
Статические блоки выполняются до того, как Spring завершит инициализацию контекста, поэтому bean-компоненты не готовы и значения становятся нулевыми.
Основная проблема
Как я могу:
- Выполнить RegisterNode() на самом раннем этапе запуска приложения
- Сделать его результат доступным для статических блоков
- Не нарушая жизненный цикл Spring
- В большом устаревшем проекте где удаление статических блоков невозможно
- Версия Java — 8 (пока не может быть обновлена), а Tomcat — 8.5.
Каков правильный Spring-совместимый способ:
- Запускать логику до того, как статические блоки будут зависеть от статических блоков это?
- Или правильно инициализировать статическую конфигурацию, которая зависит от компонентов, управляемых Spring?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ore-spring
Мобильная версия