Apache Camel - CamelContext

CamelContext cung cấp quyền truy cập vào tất cả các dịch vụ khác trong Camel như thể hiện trong hình sau:

Hãy để chúng tôi xem xét các dịch vụ khác nhau. CácRegistrytheo mặc định, mô-đun là sổ đăng ký JNDI, chứa tên của các Javabeans khác nhau mà ứng dụng của bạn sử dụng. Nếu bạn sử dụng Camel với Spring, đây sẽ là SpringApplicationContext. Nếu bạn sử dụng Camel trong vùng chứa OSGI, đây sẽ làOSGI registry. CácType convertersnhư tên cho thấy chứa các bộ chuyển đổi kiểu được tải khác nhau, chuyển đổi đầu vào của bạn từ định dạng này sang định dạng khác. Bạn có thể sử dụng các bộ chuyển đổi loại tích hợp sẵn hoặc cung cấp cơ chế chuyển đổi của riêng bạn. CácComponentsmô-đun chứa các thành phần được ứng dụng của bạn sử dụng. Các thành phần được tải bằng cách tự động khám phá trênclasspathmà bạn chỉ định. Trong trường hợp vùng chứa OSGI, chúng được tải bất cứ khi nào một gói mới được kích hoạt. Chúng tôi đã thảo luận vềEndpointsRoutestrong các chương trước. CácData formats mô-đun chứa các định dạng dữ liệu đã tải và cuối cùng là Languages mô-đun đại diện cho các ngôn ngữ được tải.

Đoạn mã ở đây sẽ cung cấp cho bạn cái nhìn sơ lược về cách CamelContext được tạo trong một ứng dụng Camel -

CamelContext context = new DefaultCamelContext();
try {
   context.addRoutes(new RouteBuilder() {
      // Configure filters and routes
   }
}
);

Các DefaultCamelContext lớp cung cấp một triển khai cụ thể của CamelContext. TrongaddRoutes , chúng tôi tạo một phiên bản ẩn danh của RouteBuilder. Bạn có thể tạo nhiềuRouteBuildercác trường hợp để xác định nhiều hơn một định tuyến. Mỗi tuyến đường trong cùng một ngữ cảnh phải có một ID duy nhất. Các tuyến có thể được thêm động trong thời gian chạy. Tuyến đường có ID giống như tuyến đường đã xác định trước đó sẽ thay thế tuyến đường cũ hơn.

Những gì bên trong RouteBuilder ví dụ được mô tả tiếp theo.

Các tuyến đường

Bộ định tuyến xác định quy tắc để di chuyển thông báo from đến một tovị trí. Bạn dùngRouteBuilderđể xác định một tuyến đường trong Java DSL. Bạn tạo một tuyến đường bằng cách mở rộngRouteBuilderlớp học. Lộ trình bắt đầu bằngfromđiểm cuối và kết thúc tại một hoặc nhiều điểm cuối. Ở giữa hai, bạn thực hiện logic xử lý. Bạn có thể định cấu hình bất kỳ số lượng tuyến đường nào trong mộtconfigure phương pháp.

Đây là một ví dụ điển hình về cách tạo tuyến đường -

context.addRoutes(new RouteBuilder() {
   @Override
   public void configure() throws Exception {
      from("direct:DistributeOrderDSL")
      .to("stream:out");
   }
}

Chúng tôi ghi đè phương thức cấu hình của RouteBuilderlớp và thực hiện cơ chế định tuyến và lọc của chúng tôi trong đó. Trong trường hợp hiện tại, chúng tôi chuyển hướng đầu vào nhận được từ Điểm cuốiDistributeOrderDSL vào bảng điều khiển, được chỉ định bởi Điểm cuối stream:out.

Lựa chọn ngôn ngữ

Bạn có thể tạo các tuyến đường bằng các ngôn ngữ khác nhau. Dưới đây là một số ví dụ về cách xác định cùng một tuyến đường bằng ba ngôn ngữ khác nhau -

Java DSL

from ("file:/order").to("jms:orderQueue");

DSL mùa xuân

<route>
   <from uri = "file:/order"/>
   <to uri = "jms:orderQueue"/>
</route>

Scala DSL

from "file:/order" -> "jms:orderQueue"

Bộ lọc

Bạn sử dụng bộ lọc để chọn một phần của nội dung đầu vào. Để thiết lập bộ lọc, bạn sử dụng bất kỳ triển khai Vị ngữ tùy ý nào . Đầu vào được lọc sau đó sẽ được gửi đến Điểm cuối đích mong muốn của bạn. Trong ví dụ này, chúng tôi lọc ra tất cả các đơn đặt hàng xà phòng để chúng có thể được gửi chung đến một nhà cung cấp xà phòng.

from("direct:DistributeOrderDSL")
   .split(xpath("//order[@product = 'soaps']/items"))
      .to("stream:out");

Trong ví dụ, chúng tôi đã sử dụng xpathvị ngữ để lọc. Nếu bạn thích sử dụng lớp Java để lọc, hãy sử dụng mã sau:

from("direct:DistributeOrderDSL")
   .filter()
      .method(new Order(),"filter")
         .to("stream:out");

Các Order là lớp Java tùy chỉnh của bạn với cơ chế lọc của riêng bạn.

Bạn có thể kết hợp nhiều vị từ trong một định tuyến như sau:

from("direct:DistributeOrderDSL")
   .choice()
      .when(header("order").isEqualTo("oil"))
         .to("direct:oil")
      .when(header("order").isEqualTo("milk"))
         .to("direct:milk")
      .otherwise()
         .to("direct:d");

Vì vậy, bây giờ tất cả các đơn đặt hàng "dầu" sẽ được chuyển cho nhà cung cấp dầu, đơn hàng "sữa" sẽ đến nhà cung cấp sữa và phần còn lại vào một nhóm chung.

Bộ xử lý tùy chỉnh

Bạn cũng có thể sử dụng xử lý tùy chỉnh. Ví dụ dưới đây tạo một bộ xử lý tùy chỉnh được gọi làmyCustomProcessor và sử dụng nó trong trình xây dựng tuyến đường.

Processor myCustomProcessor = new Processor() {
   public void process(Exchange exchange) {
      // implement your custom processing
   }
};
RouteBuilder builder = new RouteBuilder() {
   public void configure() {
      from("direct:DistributeOrderDSL")
      .process(myProcessor);
   }
};

Bạn có thể sử dụng bộ xử lý tùy chỉnh cùng với sự lựa chọn và lọc để kiểm soát tốt hơn việc dàn xếp và định tuyến của mình -

from("direct:DistributeOrderDSL")
   .filter(header("order").isEqualTo("milk"))
      .process(myProcessor);

Sử dụng XML

Các tuyến có thể được xác định bằng XML lớn hơn, nếu bạn thích nó. Đoạn mã XML sau đây cho biết cách tạo một tuyến đường cùng với một số lọc qua Spring XML:

<camelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "direct:DistributeOrderXML"/>
      <log message = "Split by Distribute Order"/>
      <split>
         <xpath>//order[@product = 'Oil']/items</xpath>
         <to uri = "file:src/main/resources/order/"/>
         <to uri = "stream:out"/>
      </split>
   </route>
</camelContext>

Sau khi xem các tuyến đường được xây dựng như thế nào, bây giờ chúng ta sẽ thấy các kỹ thuật tạo Điểm cuối khác nhau.