Как вызвать метод Spring @Service перед статической инициализацией (до полной загрузки контекста Spring)?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как вызвать метод Spring @Service перед статической инициализацией (до полной загрузки контекста Spring)?

Сообщение Anonymous »

У меня есть приложение Spring, в котором мне нужно инициализировать nodeId на очень раннем этапе запуска приложения.
Проблема в следующем:
  • используется внутри статических блоков некоторых классов.
  • Одним из этих классов является DeploymentConfig.
  • Код: Выделить всё

    DeploymentConfig
    загружается до полной инициализации контекста Spring.
  • Поэтому я не могу нормально внедрить 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), поэтому мы должны зарегистрировать узел во время выполнения.
  • Нам нужен стабильный логический идентификатор узла.
  • Код: Выделить всё

    registerNode()
    должен вызываться перед любыми статическими блоками, использующими nodeId.
Что я пробовал Но проблема в порядке:
Статические блоки выполняются до того, как Spring завершит инициализацию контекста, поэтому bean-компоненты не готовы и значения становятся нулевыми.

Основная проблема
Как я могу:
  • Выполнить RegisterNode() на самом раннем этапе запуска приложения
  • Сделать его результат доступным для статических блоков
  • Не нарушая жизненный цикл Spring
  • В большом устаревшем проекте где удаление статических блоков невозможно
  • Версия Java — 8 (пока не может быть обновлена), а Tomcat — 8.5.
Вопрос
Каков правильный Spring-совместимый способ:
  • Запускать логику до того, как статические блоки будут зависеть от статических блоков это?
  • Или правильно инициализировать статическую конфигурацию, которая зависит от компонентов, управляемых Spring?
Существует ли чистое архитектурное решение для этого сценария?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... ore-spring
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»