Пример Spring Integration DSL Cafe - как соединяются каналы?

1

Документация Spring DSL предоставляет образец проекта - кафе

Я не уверен в том, как это работает. Вставка соответствующих выдержек здесь: (Полный источник по указанной ссылке)

@Configuration
@EnableAutoConfiguration
@IntegrationComponentScan
public class Application {

public static void main(String[] args) throws InterruptedException {
    ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);

    Cafe cafe = ctx.getBean(Cafe.class);
    for (int i = 1; i <= 100; i++) {
        Order order = new Order(i);
        order.addItem(DrinkType.LATTE, 2, false);
        order.addItem(DrinkType.MOCHA, 3, true);
        cafe.placeOrder(order);
    }

    Thread.sleep(60000);

    ctx.close();
}

@MessagingGateway
public interface Cafe {

    @Gateway(requestChannel = "orders.input")
    void placeOrder(Order order);

}


@Bean
public IntegrationFlow orders() {
    return f -> f
            .split(Order.class, Order::getItems)
            .channel(c -> c.executor(Executors.newCachedThreadPool()))
            // SNIP
}

Читая этот пример, я не могу понять пару моментов:

  • Интерфейс Cafe предоставляет @Gateway который подключается к requestChannel = "orders.input". Однако этот канал нигде не определен. Как это работает?

  • Фрагмент DSL не подключен к каналам с любыми каналами, и он не ссылается на метод Cafe::placeOrder - как он подключается к каналу orders.input для получения входящего Order?

Теги:
spring
spring-integration

1 ответ

4
Лучший ответ

Мы только что опубликовали (вчера) пошаговое руководство для образца dsl кафе, в котором содержится много подробностей о внутренних компонентах.

При использовании лямбда-версии (f → f.split()...) фреймворк объявляет неявный DirectChannel с именем bean ("orders") + ".input" качестве своего id.

Вы также можете использовать return IntegrationFlows.from("myChannel").....get() return IntegrationFlows.from("myChannel").....get() вместо выражения лямбда, и, опять же, структура будет автоматически генерировать канал, если он еще не объявлен как bean-компонент.

Дополнительную информацию см. В разделе javadoc InterationFlows.

cafe.placeOrder() вызывается в последней строке цикла for в main методе. Структура создает прокси для интерфейса, который обертывает объект Order в сообщении и отправляет его на канал запроса шлюза.

  • 0
    Ах, неявный канал, использующий имя бина, был частью, которую я пропустил. Кстати, документы могут сделать это немного яснее (хотя я ценю, что чернила на этом материале почти не высыхают). Спасибо за разъяснение.
  • 0
    Спасибо, Гэри! Марти, на самом деле документы делают это для тебя. Смотрите: github.com/spring-projects/spring-integration-java-dsl/wiki/… . Если это все еще не ясно, пожалуйста, поднимите проблему GH по этому вопросу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню