Spring Integration Java DSL IntegrationFlow as Gateway не запускается

Я использую стандартный Spring @RestController внутри приложения Spring Boot, которое вызывает Spring Integration, чтобы инициировать поток сообщений. Насколько я понимаю, крючком для Spring Integration в этом случае является использование шлюза - кажется, есть несколько разных способов сделать это с помощью Java DSL.

В настоящее время у меня это работает двумя разными способами:

  1. путем определения интерфейса, отмеченного аннотацией @MessagingGateway.
  2. путем создания экземпляра new GatewayProxyFactoryBean(Consumer.class) и установки канала.

Оба они кажутся немного неуклюжими - кажется, есть третий, более чистый способ, который позволяет вам не аннотировать или вручную создавать GatewayProxyFactoryBean, а просто использовать встроенный функциональный интерфейс с именем bean-компонента. Из документов:

@Bean
public IntegrationFlow errorRecovererFlow() {
    return IntegrationFlows.from(Function.class, "errorRecovererFunction")
            .handle((GenericHandler<?>) (p, h) -> {
                throw new RuntimeException("intentional");
            }, e -> e.advice(null))
            .get();
}


@Autowired
@Qualifier("errorRecovererFunction")
private Function<String, String> errorRecovererFlowGateway;

Однако bean-компонент errorRecovererFunction не регистрируется, и приложение не запускается.

Field errorRecovererFlowGateway in MyController required a bean of type 'java.util.function.Function' that could not be found.

Я что-то упустил?

Заранее спасибо.


person Martin Pritchard    schedule 12.10.2018    source источник
comment
Есть ли шансы, что вы можете поделиться с нами простым проектом на GitHub, чтобы мы могли играть и воспроизводить?   -  person Artem Bilan    schedule 12.10.2018
comment
Пока все хорошо, и я надеюсь, что у вас где-то есть @EnableIntegration или это приложение Spring Boot. Также убедитесь, что контроллер и поток интеграции находятся в одном контексте.   -  person Artem Bilan    schedule 12.10.2018


Ответы (1)


Сделал вот такое приложение:

@SpringBootApplication
@RestController
public class So52778707Application {

    @Autowired
    @Qualifier("errorRecovererFunction")
    @Lazy
    private Function<String, String> errorRecovererFlowGateway;

    @GetMapping("/errorRecoverer")
    public String getFromIntegrationGateway(@RequestParam("param") String param) {
        return this.errorRecovererFlowGateway.apply(param);
    }

    @Bean
    public IntegrationFlow errorRecovererFlow() {
        return IntegrationFlows.from(Function.class, "errorRecovererFunction")
                .handle((p, h) -> {
                    throw new RuntimeException("intentional");
                })
                .get();
    }

    public static void main(String[] args) {
        SpringApplication.run(So52778707Application.class, args);
    }

}

Обратите внимание на аннотацию @Lazy в свойстве errorRecovererFlowGateway autowiring. В Документах об этой аннотации говорится:

Если вы хотите повлиять на порядок создания определенных bean-компонентов при запуске, рассмотрите возможность объявления некоторых из них как @Lazy (для создания при первом доступе, а не при запуске) или как @DependsOn определенных других bean-компонентов (убедитесь, что определенные другие bean-компоненты созданы до текущего bean-компонента. , помимо того, что подразумевают прямые зависимости последнего).

Я думаю, нам нужно уточнить в Справочном руководстве по интеграции Spring, что bean-компоненты, созданные во время IntegrationFlow синтаксического анализа, не могут быть внедрены как есть, но аннотацию @Lazy следует учитывать для отложенного разрешения bean-компонентов.

person Artem Bilan    schedule 12.10.2018
comment
Спасибо, Артем! Теперь это отлично работает. Для меня этот тип настройки - самый ясный и чистый способ подключиться к Spring Integration из обычного приложения Spring Boot, и он должен быть заметен в документации. Из документации Java DSL может быть довольно сложно понять, как входить в поток и выходить из него из кода приложения. - person Martin Pritchard; 15.10.2018