Документация 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
?
Мы только что опубликовали (вчера) пошаговое руководство для образца 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
в сообщении и отправляет его на канал запроса шлюза.