Skip to content

10.1.3 Sử dụng cấu hình DSL của Spring Integration

Hãy cùng thử một cách khác để định nghĩa luồng tích hợp ghi file. Lần này, bạn vẫn sẽ định nghĩa nó bằng Java, nhưng sẽ sử dụng DSL Java của Spring Integration. Thay vì khai báo một bean riêng biệt cho từng thành phần trong luồng, bạn sẽ khai báo một bean duy nhất định nghĩa toàn bộ luồng.

Liệt kê 10.4 Cung cấp API fluent để thiết kế các 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.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.dsl.MessageChannels;
import org.springframework.integration.file.dsl.Files;
import org.springframework.integration.file.support.FileExistsMode;

@Configuration
public class FileWriterIntegrationConfig {

  @Bean
  public IntegrationFlow fileWriterFlow() {
    return IntegrationFlows
      .from(MessageChannels.direct("textInChannel"))
      .<String, String>transform(t -> t.toUpperCase())
      .handle(Files
        .outboundAdapter(new File("/tmp/sia6/files"))
        .fileExistsMode(FileExistsMode.APPEND)
        .appendNewLine(true))
      .get();
  }
}

Cấu hình mới này ngắn gọn nhất có thể, nắm bắt toàn bộ luồng trong một phương thức bean duy nhất. Lớp IntegrationFlows khởi tạo builder API, từ đó bạn có thể khai báo luồng.

Trong liệt kê 10.4, bạn bắt đầu bằng cách nhận thông điệp từ kênh có tên textInChannel, sau đó đến một transformer chuyển payload của thông điệp thành chữ in hoa. Sau transformer, thông điệp được xử lý bởi một outbound channel adapter được tạo từ kiểu Files do mô-đun file của Spring Integration cung cấp. Cuối cùng, lời gọi đến get() sẽ xây dựng IntegrationFlow để trả về. Tóm lại, phương thức bean duy nhất này định nghĩa cùng một luồng tích hợp như các ví dụ cấu hình bằng XML và Java.

Bạn sẽ nhận thấy rằng, cũng giống như trong ví dụ cấu hình Java, bạn không cần khai báo rõ ràng các bean kênh. Mặc dù bạn tham chiếu đến textInChannel, nhưng nó sẽ được Spring Integration tự động tạo ra vì không có bean kênh nào có tên đó tồn tại trước đó. Tuy nhiên, bạn vẫn có thể khai báo rõ ràng bean kênh nếu muốn.

Còn đối với kênh kết nối transformer với outbound channel adapter, bạn thậm chí không cần tham chiếu đến nó bằng tên. Nếu cần cấu hình kênh một cách rõ ràng, bạn có thể tham chiếu đến nó bằng tên trong định nghĩa luồng với lời gọi đến channel() như sau:

java
@Bean
public IntegrationFlow fileWriterFlow() {
  return IntegrationFlows
    .from(MessageChannels.direct("textInChannel"))
    .<String, String>transform(t -> t.toUpperCase())
    .channel(MessageChannels.direct("FileWriterChannel"))
    .handle(Files
      .outboundAdapter(new File("/tmp/sia6/files"))
      .fileExistsMode(FileExistsMode.APPEND)
      .appendNewLine(true))
    .get();
}

Một điều cần ghi nhớ khi làm việc với DSL Java của Spring Integration (cũng như bất kỳ API fluent nào) là bạn phải sử dụng khoảng trắng một cách khôn ngoan để đảm bảo dễ đọc. Trong ví dụ được đưa ra ở đây, tôi đã cẩn thận thụt dòng để chỉ ra các khối mã liên quan. Với những luồng dài hơn và phức tạp hơn, bạn thậm chí nên cân nhắc việc trích xuất một phần của luồng thành các phương thức hoặc subflow riêng biệt để dễ đọc hơn.

Giờ đây, khi bạn đã thấy một luồng đơn giản được định nghĩa bằng ba phong cách cấu hình khác nhau, hãy lùi lại và cùng nhìn vào bức tranh tổng thể của Spring Integration.

Released under the MIT License.