Skip to content

10.1.2 Cấu hình luồng tích hợp bằng Java

Hầu hết các ứng dụng Spring hiện đại đã từ bỏ cấu hình XML để chuyển sang cấu hình bằng Java. Thực tế, trong các ứng dụng Spring Boot, cấu hình Java là phong cách tự nhiên để bổ sung cho tính năng tự động cấu hình (autoconfiguration). Do đó, nếu bạn đang thêm một luồng tích hợp vào ứng dụng Spring Boot, thì hoàn toàn hợp lý khi định nghĩa luồng đó bằng Java.

Là một ví dụ về cách viết luồng tích hợp bằng cấu hình Java, hãy xem danh sách dưới đây. Nó hiển thị luồng tích hợp ghi tệp tương tự như trước, nhưng lần này được viết bằng Java.

Danh sách 10.3 Sử dụng cấu hình Java để định nghĩa một luồng tích hợp

java
package sia6;

import java.io.File;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.annotation.Transformer;
import org.springframework.integration.file.FileWritingMessageHandler;
import org.springframework.integration.file.support.FileExistsMode;
import org.springframework.integration.transformer.GenericTransformer;

@Configuration
public class FileWriterIntegrationConfig {

  @Bean
  @Transformer(inputChannel="textInChannel",
            outputChannel="fileWriterChannel")

  public GenericTransformer<String, String> upperCaseTransformer() {
    return text -> text.toUpperCase();
  }

  @Bean
  @ServiceActivator(inputChannel="fileWriterChannel")
  public FileWritingMessageHandler fileWriter() {
    FileWritingMessageHandler handler =
        new FileWritingMessageHandler(new File("/tmp/sia6/files"));
    handler.setExpectReply(false);
    handler.setFileExistsMode(FileExistsMode.APPEND);
    handler.setAppendNewLine(true);
    return handler;
  }

}

Với cấu hình Java, bạn khai báo hai bean: một bộ chuyển đổi (transformer) và một message handler để ghi file. Bộ chuyển đổi là một GenericTransformer. Vì GenericTransformer là một interface hàm (functional interface), bạn có thể cung cấp phần hiện thực của nó dưới dạng một lambda gọi toUpperCase() trên nội dung văn bản của thông điệp. Bean transformer được chú thích với @Transformer, đánh dấu nó là một transformer trong luồng tích hợp, nhận thông điệp từ kênh textInChannel và ghi thông điệp đến kênh fileWriterChannel.

Đối với bean ghi file, nó được chú thích với @ServiceActivator để chỉ ra rằng nó sẽ nhận thông điệp từ fileWriterChannel và chuyển các thông điệp đó đến dịch vụ được định nghĩa bởi một instance của FileWritingMessageHandler. FileWritingMessageHandler là một message handler ghi payload của thông điệp vào một tệp trong thư mục chỉ định, sử dụng tên tệp được cung cấp trong header "file_name" của thông điệp. Giống như ví dụ XML, FileWritingMessageHandler được cấu hình để ghi nối tiếp (append) vào tệp cùng với một dòng mới.

Một điểm đặc biệt trong cấu hình của bean FileWritingMessageHandler là có lời gọi đến setExpectReply(false) để chỉ ra rằng service activator không nên mong đợi một reply channel (một kênh để trả lại giá trị cho các thành phần upstream trong luồng). Nếu bạn không gọi setExpectReply(false), bean ghi file sẽ mặc định là true, và mặc dù pipeline vẫn hoạt động như mong đợi, bạn sẽ thấy một vài lỗi được ghi log thông báo rằng không có reply channel nào được cấu hình.

Bạn cũng sẽ nhận thấy rằng bạn không cần phải khai báo rõ ràng các kênh. Các kênh textInChannelfileWriterChannel sẽ được tự động tạo nếu không có bean nào với các tên đó tồn tại. Nhưng nếu bạn muốn kiểm soát nhiều hơn cách các kênh được cấu hình, bạn có thể tạo chúng rõ ràng dưới dạng bean như sau:

java
@Bean
public MessageChannel textInChannel() {
    return new DirectChannel();
}
...
@Bean
public MessageChannel fileWriterChannel() {
    return new DirectChannel();
}

Tùy chọn cấu hình Java có thể được xem là dễ đọc hơn—và ngắn gọn hơn một chút—và chắc chắn phù hợp với phong cách cấu hình chỉ dùng Java mà tôi đang hướng đến trong cuốn sách này. Tuy nhiên, nó còn có thể được làm gọn hơn nữa bằng cách sử dụng phong cách cấu hình Java DSL (domain-specific language) của Spring Integration.

Released under the MIT License.