Конфигурация Spring Autowire во флинке - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь использовать сочетание Flink и Springboot, и у меня возникли некоторые проблемы. Допустим, у меня есть этот поток.

  1. Получение json строки с одной датой поля, содержащей строку даты.
  2. с использованием функции map и ObjectMapper для анализа ее в объекте LocalDateTime
  3. print

Это простой пример использования, который опишет мой зонд.

Итак, у меня есть Word, представляющий класс Word, содержащий поле LocalDateTime.

@Data
public class Word {
    @JsonDeserialize(using = LocalDateTimeSerde.class)
    LocalDateTime date;
}

LocalDateTimeDeserlization выглядит так (я хочу автоматически связать конфигурацию приложения):

@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@JsonComponent
public class LocalDateTimeSerde extends JsonDeserializer<LocalDateTime> {
    private final AppConf conf;

    @Override
    public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(this.conf.getDateFormatter());
        return LocalDateTime.parse(jsonParser.getText(), formatter);
    }
}

AppConf. java повторная настройка конфигурации приложения:

@Data
@Configuration
@ConfigurationProperties(value = "app")
public class AppConf {
    private String dateFormatter;

}

DemoApplication. java:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironment(1);
String example = "{\"date\":\"2019-01-29 00:00\"}";
var stream = env
        .fromElements(example)
        .map(x->new ObjectMapper().readValue(x,Word.class))
        .returns(Word.class);
stream.print();

env.execute("Demo App");

Исключение, которое я получаю:

Caused by: java.lang.IllegalArgumentException: Class com.example.demo.LocalDateTimeSerde has no default (no arg) constructor

Основная проблема заключается в том, что код десериализации выполняется на TaskManager и там Springboot не принимает участия, поэтому он не внедряет AppConf в класс.

Добавление @NoArgsConstructor не решит проблему

I Мне кажется, я знаю, почему это происходит (потому что flink master сериализует классы рабочим, а затем springboot не «ScanComponents» и получает контроль.

Есть ли какое-то решение для этого? Я действительно хочу совместить весну с мерцанием и в функции рабочего.

Спасибо.

1 Ответ

0 голосов
/ 30 января 2020

В общем, я лично не думаю, что это хорошая идея - смешивать эти понятия. Самое простое решение - использовать AutoWired только в менеджере заданий и использовать явное внедрение зависимостей при go в Flink-land.

Например, вы можете извлечь шаблон даты в DemoApplication и установить его в ObjectMapper. (Не забудьте инициализировать ObjectMapper только один раз в вашем реальном коде!)

Если вы действительно хотите использовать AutoWiring. Я полагаю, вам нужно вручную запустить автоматическое подключение на диспетчере задач. Есть статья, связанная с специально для ObjectMapper .

...