Spring Integration DSL Cafe示例 - 如何连接频道?

时间:2014-11-26 11:47:49

标签: java spring spring-integration

Spring DSL文档提供了一个示例项目 - café

我不确定这是如何工作的几个方面。在此处粘贴相关摘录:(以上链接的完整来源)

@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的{​​{1}}。然而,这个channnel没有在任何地方定义。这是如何工作的?

  • DSL代码段没有连接到任何渠道使用,也没有引用requestChannel = "orders.input"方法 - 这如何连接到Cafe::placeOrder频道以接收入站orders.input

1 个答案:

答案 0 :(得分:5)

我们刚刚发布了(昨天)一个line-by-line tutorial for the cafe dsl sample,其中详细介绍了内部结构。

当使用lambda版本(f -> f.split()...)时,框架声明一个隐含的DirectChannel,其中bean名称("orders")+ ".input"作为其id。

您也可以使用return IntegrationFlows.from("myChannel"). ... .get()而不是lambda表达式,如果没有声明为bean,框架将自动生成通道。

有关详细信息,请参阅InterationFlows javadoc。

cafe.placeOrder()方法的for循环的最后一行调用

main。该框架为包含消息中的Order对象的接口创建了一个代理,并将其发送到网关的请求通道。