Проблема здесь в том, что ApplicationContext недоступен ни для одного работника, так как метод main
вызывается только при создании задания, а не на любом рабочем компьютере. Следовательно, initSpringApplicationContext
никогда не вызывается ни для какого работника.
Я никогда не пытался использовать Spring в Apache Beam, но, думаю, перемещение initSpringApplicationContext
в блок статического инициализатора приведет к ожидаемому результату.
public class ApplicationContextHolder {
private static final ApplicationContext CTX;
static {
CTX = initApplicationContext();
}
public static ApplicationContext getContext() {
return CTX;
}
}
Имейте в виду, что это само по себе не должно рассматриваться как лучший способ использования Spring в Apache Beam, так как он плохо интегрируется в жизненный цикл Apache Beam. Например, когда ошибка происходит во время инициализации контекста приложения, она будет появляться в первую очередь, где используется ApplicationContextHolder
. Поэтому я бы рекомендовал извлечь initApplicationContext
из блока статического инициализатора и явно вызывать его в отношении жизненного цикла Apache Beam. Фаза setup была бы хорошим местом для этого.