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
的requestChannel = "orders.input"
。但是,此通道未在任何地方定义。这是如何运作的?DSL代码段没有连接到任何通道使用,也没有引用
Cafe::placeOrder
方法-它如何连接到orders.input
通道以接收入站Order
? 最佳答案
我们昨天(昨天)发布了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()
在main
方法的for循环的最后一行中调用。该框架为接口创建代理,该代理将Order
对象包装在消息中,并将其发送到网关的请求通道。