2014-11-26 2 views
1

Документация Spring DSL предоставляет пример проекта - caféSpring Integration Пример DSL Cafe - как подключаются каналы?

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

@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?

ответ

4

Мы только что опубликовали (вчера) a line-by-line tutorial for the cafe dsl sample, который содержит множество подробностей о внутренних деталях.

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

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

Для получения дополнительной информации см. InterationFlows javadoc.

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

+0

Ах, неявный канал, использующий имя компонента, был темой, которую я отсутствовал. FWIW, документы могли бы сделать это немного яснее (хотя я ценю, что чернила на этом не сухие). Спасибо за разъяснения. –

+0

Спасибо, Гэри! Марти, на самом деле, делает это для вас. См. Https://github.com/spring-projects/spring-integration-java-dsl/wiki/Spring-Integration-Java-DSL-Reference#flows. Если это еще не ясно, пожалуйста, поднимите GH-вопрос по этому вопросу. –

Смежные вопросы