Настройте подпоток как компонент для PublishSubscribeChannel в Spring интеграции DSL

Согласно разделу Поддержка подпотоков руководства, можно было бы ожидать, что можно будет очень просто настроить подпоток: с помощью фабрик DSL или лямбда-выражений.

// This is modified example from the guide.

@Bean
public IntegrationFlow subscribersFlow() {
    return flow -> flow
            .publishSubscribeChannel(Executors.newCachedThreadPool(), s -> s
                    .subscribe(f -> f
                            .<Integer>handle((p, h) -> p / 2)
                            .channel(c -> c.queue("subscriber1Results")))
                    .subscribe(
                            // this.subflow1()
                            this.subflow2()

                    ))
            .<Integer>handle((p, h) -> p * 3)
            .channel(c -> c.queue("subscriber3Results"));
}

// Attempt 1:
// Just a copy paste of the logic from above.
// Does not work, java.lang.UnsupportedOperationException

@Bean
public IntegrationFlow subflow1() {
    return f -> f
            .<Integer>handle((p, h) -> p * 2)
            .channel(c -> c.queue("subscriber2Results"));
}

// Attempt 2:
// Using DSL factories.
// Does not work, java.lang.UnsupportedOperationException

@Bean
public IntegrationFlow subflow2() {
    return IntegrationFlows.from(MessageChannels.direct())
            .<Integer>handle((p, h) -> p * 2)
            .channel(c -> c.queue("subscriber2Results"))
            .get();
}

Я получаю это исключение со второй попыткой, указанной выше.

Caused by: java.lang.UnsupportedOperationException
at org.springframework.integration.dsl.StandardIntegrationFlow.configure(StandardIntegrationFlow.java:100)
at org.springframework.integration.dsl.PublishSubscribeSpec.subscribe(PublishSubscribeSpec.java:51)

Я пробовал с spring-boot-starter-integration:2.0.0.M3. Я что-то упускаю ? Спасибо за вашу помощь.


person George    schedule 25.08.2017    source источник


Ответы (1)


Подпотоки не должны быть как бобы. Вы определенно можете извлечь их собственными методами, даже private. Но разводку всего вместе вы должны оставить Framework.

Если они вам все еще нужны как bean-компоненты, используйте соединение между потоками через каналы сообщений.

person Artem Bilan    schedule 25.08.2017
comment
Спасибо, я не думал, что это так просто. Для записи первая попытка сработает, просто нужно удалить @Bean в определении подпотока. - person George; 08.09.2017