10.2.8 Bộ điều hợp kênh (Channel adapters)
Bộ điều hợp kênh đại diện cho các điểm vào và điểm ra của một luồng tích hợp. Dữ liệu đi vào luồng tích hợp thông qua một bộ điều hợp kênh đầu vào (inbound channel adapter) và rời khỏi luồng tích hợp thông qua một bộ điều hợp kênh đầu ra (outbound channel adapter). Điều này được minh họa trong hình 10.9.

Hình 10.9 Bộ điều hợp kênh là điểm vào và ra của một luồng tích hợp.
Bộ điều hợp kênh đầu vào có thể có nhiều hình thức, tùy thuộc vào nguồn dữ liệu mà chúng đưa vào luồng. Ví dụ, bạn có thể khai báo một bộ điều hợp kênh đầu vào đưa các số tăng dần từ một AtomicInteger vào luồng. Khi sử dụng cấu hình Java, nó có thể trông như sau:
@Bean
@InboundChannelAdapter(
poller=@Poller(fixedRate="1000"), channel="numberChannel")
public MessageSource<Integer> numberSource(AtomicInteger source) {
return () -> {
return new GenericMessage<>(source.getAndIncrement());
};
}Phương thức @Bean này khai báo một bean bộ điều hợp kênh đầu vào mà, theo chú thích @InboundChannelAdapter, sẽ gửi một số từ AtomicInteger được tiêm vào tới kênh có tên numberChannel mỗi 1 giây (hoặc 1.000 mili giây).
Trong khi @InboundChannelAdapter được dùng để chỉ định một bộ điều hợp kênh đầu vào khi sử dụng cấu hình Java, thì phương thức from() là cách thực hiện điều này khi sử dụng Java DSL để định nghĩa luồng tích hợp. Đoạn mã sau cho thấy một bộ điều hợp kênh đầu vào tương tự được định nghĩa bằng Java DSL:
@Bean
public IntegrationFlow someFlow(AtomicInteger integerSource) {
return IntegrationFlows
.from(integerSource, "getAndIncrement",
c -> c.poller(Pollers.fixedRate(1000)))
...
.get();
}Thường thì, các bộ điều hợp kênh được cung cấp bởi một trong nhiều mô-đun endpoint của Spring Integration. Giả sử, ví dụ, bạn cần một bộ điều hợp kênh đầu vào giám sát một thư mục cụ thể và gửi bất kỳ tệp nào được ghi vào thư mục đó dưới dạng các message đến một kênh có tên file-channel. Cấu hình Java sau sử dụng FileReadingMessageSource từ mô-đun endpoint file của Spring Integration để thực hiện điều đó:
@Bean
@InboundChannelAdapter(channel="file-channel",
poller=@Poller(fixedDelay="1000"))
public MessageSource<File> fileReadingMessageSource() {
FileReadingMessageSource sourceReader = new FileReadingMessageSource();
sourceReader.setDirectory(new File(INPUT_DIR));
sourceReader.setFilter(new SimplePatternFileListFilter(FILE_PATTERN));
return sourceReader;
}Khi viết bộ điều hợp kênh đầu vào để đọc tệp tương đương trong Java DSL, phương thức inboundAdapter() từ lớp Files sẽ thực hiện chức năng tương tự. Như được trình bày tiếp theo, một bộ điều hợp kênh đầu ra là điểm kết thúc của luồng tích hợp, chuyển giao message cuối cùng đến ứng dụng hoặc một hệ thống khác:
@Bean
public IntegrationFlow fileReaderFlow() {
return IntegrationFlows
.from(Files.inboundAdapter(new File(INPUT_DIR))
.patternFilter(FILE_PATTERN))
.get();
}Các bộ kích hoạt dịch vụ (service activators), được triển khai dưới dạng trình xử lý message, thường đóng vai trò là bộ điều hợp kênh đầu ra, đặc biệt khi dữ liệu cần được chuyển giao đến chính ứng dụng. Chúng ta đã bàn về các bộ kích hoạt dịch vụ, vì vậy không cần lặp lại phần đó.
Tuy nhiên, cũng đáng lưu ý rằng các mô-đun endpoint của Spring Integration cung cấp các trình xử lý message hữu ích cho một số trường hợp sử dụng phổ biến. Bạn đã thấy một ví dụ về bộ điều hợp kênh đầu ra như vậy, FileWritingMessageHandler, trong danh sách 10.3. Nói về các mô-đun endpoint của Spring Integration, hãy cùng điểm qua nhanh những mô-đun endpoint tích hợp sẵn hiện có.
