Message Channels

The MessageChannel Interface

public interface MessageChannel {

    boolean send(Message message);

    boolean send(Message message, long timeout);
}

λ©”μ‹œμ§€λ₯Ό 보낼 λ•Œ λ©”μ‹œμ§€κ°€ μ„±κ³΅μ μœΌλ‘œ μ „μ†‘λ˜λ©΄ λ°˜ν™˜ 값은 trueμž…λ‹ˆλ‹€. 보내기 호좜이 μ‹œκ°„ μ΄ˆκ³Όλ˜κ±°λ‚˜ μ€‘λ‹¨λ˜λ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

PollableChannel

λ©”μ‹œμ§€ 채널은 λ©”μ‹œμ§€λ₯Ό λ²„νΌλ§ν•˜κ±°λ‚˜ λ²„νΌλ§ν•˜μ§€ μ•Šμ„ 수 μžˆμœΌλ―€λ‘œ 두 개의 ν•˜μœ„ μΈν„°νŽ˜μ΄μŠ€κ°€ 버퍼링(폴링 κ°€λŠ₯) 및 비버퍼링(ꡬ독 κ°€λŠ₯) 채널 λ™μž‘μ„ μ •μ˜ν•©λ‹ˆλ‹€

public interface PollableChannel extends MessageChannel {

    Message<?> receive();

    Message<?> receive(long timeout);

}

SubscribableChannel

SubscribableChannel κΈ°λ³Έ μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬λ…λœ MessageHandler μΈμŠ€ν„΄μŠ€μ— λ©”μ‹œμ§€λ₯Ό 직접 λ³΄λ‚΄λŠ” 채널에 μ˜ν•΄ κ΅¬ν˜„λ©λ‹ˆλ‹€. λ”°λΌμ„œ 폴링을 μœ„ν•œ μˆ˜μ‹  방법을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  μ΄λŸ¬ν•œ κ΅¬λ…μžλ₯Ό κ΄€λ¦¬ν•˜λŠ” 방법을 μ •μ˜ν•©λ‹ˆλ‹€.

Message Channel Implementations

PublishSubscribeChannel

PublishSubscribeChannel κ΅¬ν˜„μ€ μ „μ†‘λœ λͺ¨λ“  λ©”μ‹œμ§€λ₯Ό κ΅¬λ…ν•œ λͺ¨λ“  ν•Έλ“€λŸ¬λ‘œ λΈŒλ‘œλ“œμΊμŠ€νŠΈν•©λ‹ˆλ‹€.

QueueChannel

QueueChannel κ΅¬ν˜„μ€ queue둜 λž˜ν•‘ν•©λ‹ˆλ‹€. PublishSubscribeChannelκ³Ό 달리 QueueChannelμ—λŠ” point-to-point semanticsκ°€ μžˆμŠ΅λ‹ˆλ‹€. 즉, 채널에 μ—¬λŸ¬ μ†ŒλΉ„μžκ°€ μžˆλ”λΌλ„ κ·Έ 쀑 ν•˜λ‚˜λ§Œ ν•΄λ‹Ή μ±„λ„λ‘œ μ „μ†‘λœ λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μΈμˆ˜κ°€ μ—†λŠ” κΈ°λ³Έ μƒμ„±μž(본질적으둜 μ œν•œλ˜μ§€ μ•Šμ€ Integer.MAX_VALUE μš©λŸ‰ 제곡)와 λ‹€μŒ λͺ©λ‘κ³Ό 같이 λŒ€κΈ°μ—΄ μš©λŸ‰μ„ ν—ˆμš©ν•˜λŠ” μƒμ„±μžλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

PriorityChannel

QueueChannel은 μ„ μž…μ„ μΆœ(FIFO) μˆœμ„œλ₯Ό μ μš©ν•˜λŠ” 반면, PriorityChannel은 μš°μ„ μˆœμœ„μ— 따라 채널 λ‚΄μ—μ„œ λ©”μ‹œμ§€λ₯Ό μ •λ ¬ν•  수 μžˆλŠ” λŒ€μ²΄ κ΅¬ν˜„μž…λ‹ˆλ‹€

기본적으둜 μš°μ„  μˆœμœ„λŠ” 각 λ©”μ‹œμ§€ λ‚΄μ˜ μš°μ„  μˆœμœ„ 헀더에 μ˜ν•΄ κ²°μ •λ©λ‹ˆλ‹€.

RendezvousChannel

RendezvousChannel은 λ‹€λ₯Έ λ‹Ήμ‚¬μžκ°€ μ±„λ„μ˜ receive() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•ŒκΉŒμ§€ λ°œμ‹ μžκ°€ μ°¨λ‹¨ν•˜λŠ” "직접 ν•Έλ“œμ˜€ν”„" μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€

DirectChannel

DirectChannelμ—λŠ” 지점 κ°„ 의미 체계가 μžˆμ§€λ§Œ κ·Έ μ™Έμ—λŠ” μ•žμ—μ„œ μ„€λͺ…ν•œ λŒ€κΈ°μ—΄ 기반 채널 κ΅¬ν˜„λ³΄λ‹€ PublishSubscribeChannelκ³Ό 더 μœ μ‚¬ν•©λ‹ˆλ‹€

PollableChannel μΈν„°νŽ˜μ΄μŠ€ λŒ€μ‹  SubscribableChannel μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ―€λ‘œ λ©”μ‹œμ§€λ₯Ό κ΅¬λ…μžμ—κ²Œ 직접 λ°œμ†‘ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ λŒ€μ  μ±„λ„λ‘œμ„œ 각 λ©”μ‹œμ§€λ₯Ό 단일 κ°€μž… MessageHandler둜 λ³΄λ‚Έλ‹€λŠ” μ μ—μ„œ PublishSubscribeChannelκ³Ό λ‹€λ¦…λ‹ˆλ‹€.

ExecutorChannel

ExecutorChannel은 DirectChannelκ³Ό λ™μΌν•œ λ””μŠ€νŒ¨μ²˜ ꡬ성(λΆ€ν•˜ κ· ν˜• μ „λž΅ 및 μž₯μ•  쑰치 λΆ€μšΈ 속성)을 μ§€μ›ν•˜λŠ” 지점간 μ±„λ„μž…λ‹ˆλ‹€.

이 두 λ””μŠ€νŒ¨μΉ˜ 채널 μœ ν˜•μ˜ μ£Όμš” 차이점은 ExecutorChannel이 λ””μŠ€νŒ¨μΉ˜λ₯Ό β€‹β€‹μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ TaskExecutor의 μΈμŠ€ν„΄μŠ€μ— μœ„μž„ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

즉, send λ©”μ„œλ“œλŠ” 일반적으둜 μ°¨λ‹¨ν•˜μ§€ μ•Šμ§€λ§Œ 보낸 μ‚¬λžŒμ˜ μŠ€λ ˆλ“œμ—μ„œ 처리기 호좜이 λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

PartitionedChannel

버전 6.1λΆ€ν„° PartitionedChannel κ΅¬ν˜„μ΄ μ œκ³΅λ©λ‹ˆλ‹€. 이것은 AbstractExecutorChannel의 ν™•μž₯이며 이 μ±„λ„λ‘œ μ „μ†‘λœ λ©”μ‹œμ§€μ—μ„œ ν‰κ°€λœ νŒŒν‹°μ…˜ 킀에 μ˜ν•΄ κ²°μ •λ˜λŠ” νŠΉμ • μŠ€λ ˆλ“œμ—μ„œ μ‹€μ œ μ†ŒλΉ„κ°€ μ²˜λ¦¬λ˜λŠ” 지점간 λ””μŠ€νŒ¨μΉ­ 논리λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

이 채널은 μœ„μ—μ„œ μ–ΈκΈ‰ν•œ ExecutorChannelκ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ νŒŒν‹°μ…˜ ν‚€κ°€ 같은 λ©”μ‹œμ§€λŠ” 항상 μˆœμ„œλ₯Ό μœ μ§€ν•˜λ©΄μ„œ λ™μΌν•œ μŠ€λ ˆλ“œμ—μ„œ μ²˜λ¦¬λœλ‹€λŠ” 차이점이 μžˆμŠ΅λ‹ˆλ‹€.

μ™ΈλΆ€ TaskExecutorκ°€ ν•„μš”ν•˜μ§€ μ•Šμ§€λ§Œ μ‚¬μš©μž μ§€μ • ThreadFactory둜 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

이 νŒ©ν† λ¦¬λŠ” 단일 μŠ€λ ˆλ“œ μ‹€ν–‰κΈ°λ₯Ό νŒŒν‹°μ…˜λ³„λ‘œ MessageDispatcher λŒ€λ¦¬μžλ‘œ μ±„μš°λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 기본적으둜 IntegrationMessageHeaderAccessor.CORRELATION_ID λ©”μ‹œμ§€ 헀더가 νŒŒν‹°μ…˜ ν‚€λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

FluxMessageChannel

FluxMessageChannel은 보낸 λ©”μ‹œμ§€λ₯Ό λ‚΄λΆ€ react.core.publisher.Flux둜 "싱크"ν•˜κΈ° μœ„ν•œ org.reactivestreams.Publisher κ΅¬ν˜„μž…λ‹ˆλ‹€.

Channel Interceptors

λ©”μ‹œμ§• μ•„ν‚€ν…μ²˜μ˜ μž₯점 쀑 ν•˜λ‚˜λŠ” 일반적인 λ™μž‘μ„ μ œκ³΅ν•˜κ³  μ‹œμŠ€ν…œμ„ ν†΅κ³Όν•˜λŠ” λ©”μ‹œμ§€μ— λŒ€ν•œ 의미 μžˆλŠ” 정보λ₯Ό λΉ„μΉ¨νˆ¬μ μΈ λ°©μ‹μœΌλ‘œ μΊ‘μ²˜ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

Message μΈμŠ€ν„΄μŠ€λŠ” MessageChannel μΈμŠ€ν„΄μŠ€μ—μ„œ μ†‘μˆ˜μ‹ λ˜λ―€λ‘œ μ΄λŸ¬ν•œ 채널은 μ†‘μˆ˜μ‹  μž‘μ—…μ„ κ°€λ‘œμ±Œ 수 μžˆλŠ” 기회λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν›„ 인터셉터λ₯Ό 채널에 λ“±λ‘ν•˜λŠ” 것은 λ‹€μŒ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

MessagingTemplate

Spring Integration은 μš”μ²­ 및 응닡 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό ν¬ν•¨ν•˜μ—¬ λ©”μ‹œμ§€ μ±„λ„μ—μ„œ λ‹€μ–‘ν•œ μž‘μ—…μ„ μ§€μ›ν•˜λŠ” MessagingTemplate을 μ œκ³΅ν•©λ‹ˆλ‹€.

Example

Signatures

Special Channels

ErrorChannel

NullChannel

Reference

Last updated