Version

5.5.3

패키지 org.springframework.integration.dsl 에는 앞에서 언급한 IntegrationFlowBuilder API와 builder이면서 구체적인 endpoint를 구성하기 위한 fluent API를 제공하는 여러 IntegrationComponentSpec 구현체가 있습니다. IntegrationFlowBuilder 구조는 채널channels, 엔드포인트endpoints, 풀러pollers 및 채널 인터셉터channel interceptor와 같은 메세지-기반 어플리케이션을 위한 EIP(enterprise integration patterns)를 제공합니다.

엔드포인트는 가독성을 향상시키기 위해 DSL에서 동사도 표현됩니다. 다음은 공통 DSL 메서드 이름과 연결된 EIP 엔드포인트입니다.

개념상으로, 인티그레이션 프로세스는 이러한 엔드포인트를 하나 이상의 메세지 흐름으로 구성하여 작성된다. EIP는 공식적으로 '메세지 흐름’이라는 용어를 정의하진 않았지만, 잘 알려진 메세징 패턴을 사용하는 작업 단위로 생각하는 것이 유용하다. DSL은 채널 및 엔드포인트의 구성을 정의하기 위해 IntegrationFlow 컴포넌트를 제공하지만, 현재 IntegrationFlow 는 어플리케이션 컨텍스트에서 실제 빈을 채우는 구성 역할만 수행하며 런타임에는 사용되지 않습니다. 그러나 IntegrationFlow 를 위한 빈은 IntegrationFlow 와 관련한 모든 Spring Integration 컴포넌트에 위임된 전체 흐름에 대한 start(), stop() 을 제어하기 위해 Lifecycle 로 오토와이어드 될 수 있다. 다음 예제에서는 IntegrationFlowBuilder 의 EIP-메서드를 사용하여 IntegrationFlow 빈을 정의하기 위해 IntegrationFlows 팩토리를 사용합니다.

@Bean
public IntegrationFlow integerFlow() {
  return IntegrationFlows
    .from("input")
    .<String, Integer>transform(Integer::parseInt)
    .get();
}

transform 메서드는 메시지 페이로드에서 작동하는 엔드포인트 인수를 람다를 허용합니다. 이 메서드의 실제 인수는 GenericTransformer<S, T> 입니다. 따라서 제공된 트랜스포머(ObjectToJsonTransformer, FileToStringTransformer 등) 중 하나를 여기에서 사용할 수 있습니다.

내부적으로 IntegrationFlowBuilder 는 각각 MessageTransformingHandlerConsumerEndpointFactoryBean 을 사용하여 MessageHandler 및 이에 대한 엔드포인트를 인식합니다. 다른 예를 고려하십시오:

@Bean
public IntegrationFlow myFlow() {
  return IntegrationFlows
    .from("input")
    .filter("World"::equals)
    .transform("Hello "::concat)
    .handle(System.out::println)
    .get();
}

The preceding example composes a sequence of Filter → Transformer → Service Activator. The flow is "'one way'". That is, it does not provide a reply message but only prints the payload to STDOUT. The endpoints are automatically wired together by using direct channels.

Warning
Lambdas And Message<?> Arguments

EIP 메서드에서 람다를 사용할 때 "input" 인수argument는 일반적으로 메세지 페이로드입니다. 전체 메세지에 접근하려면 Class<?> 를 첫번째 파라미터로 사용하는 오버로드된 메서드 중 하나를 사용하세요. 예를 들어 다음 코드는 동작하지 않습니다:

.<Message<?>, Foo>transform(m -> newFooFromMessage(m))

이는 람다가 인수 타입을 유지하지 않고 프레임워크가 페이로드를 Message<?> 로 캐스팅하려고 시도하기 때문에 런타임에 ClassCastException 과 함께 실패합니다.

대신 다음과 같이 사용하세요:

.(Message.java, m -> newFooFromMessage(m))
Warning
Bean Definitions override