2013-01-24 27 views
6

Apache Camel cung cấp một số cách để thực hiện các biến đổi dữ liệu: khái niệm về Transform EIP, DataFormats tùy chỉnh, cũng như phụ cấp của nó cho Trình chuyển đổi loại tùy chỉnh.Cấu trúc Camel nào phù hợp để chuyển đổi?

Tôi có một tình huống mà tôi cần phải thực hiện một biến đổi rất phức tạp từ bên trong một tuyến đường Camel. Tôi có nên được thực hiện Loại Chuyển đổi của riêng tôi, dataFormat của riêng tôi, hay tôi nên thực hiện org.apache.camel.Expression và đặt tất cả các thay đổi nội dung trong đó:

public class MyTransformer implements Expression { 
    @Override 
    public <T> T evaluate(Exchange arg0, Class<T> arg1) { 
     // ... 
    } 
} 

Tôi đoán tôi đang bối rối về nơi/khi nó phù hợp để sử dụng riêng của bạn Loại Converter, khi sử dụng bộ xử lý .transform(myTransformer), hoặc khi nào sử dụng DataFormat tùy chỉnh. Cảm ơn trước!

Trả lời

9

Sự khác biệt là tinh tế, mặc dù chúng đều được sử dụng cho những thứ khác nhau. Bạn nên sử dụng:

  • transformer khi bạn chuyển đổi "tải trọng kinh doanh" từ hình này sang hình khác. Ví dụ, khi bạn đang chuyển đổi các đối tượng giá trị mà bạn đã kéo từ một DAO vào các đối tượng được chú thích JAXB mà bạn sẽ sử dụng để gọi một webservice.
  • a data format khi bạn muốn marshall một đại diện cấp cao, chẳng hạn như một số loại đối tượng, vào một đại diện cấp thấp hơn - một cái gì đó mà bạn sẽ gửi qua một dây. Các định dạng dữ liệu bao gồm tuần tự hóa, bộ đệm giao thức của Google, JSON, JAXB, v.v.
  • a type converter khi bạn thay đổi cách bạn truy cập vào phần trình bày của thư. Ví dụ. một chuỗi và một mảng byte hoặc một InputStream vẫn đọc các ký tự giống nhau, do đó, bạn có thể viết (mặc dù có thực sự được xây dựng trong) chuyển đổi mà chuyển đổi giữa bất kỳ hai trong số này.
2

Chỉ cần thêm những gì Jake đã nói ở trên. Tất cả phụ thuộc vào.

Và bạn không cần phải sử dụng bất kỳ API Camel nào để thực hiện điều đó. Có thể có những tình huống mà bạn cần phải chuyển tải trọng tải tin nhắn chỉ một lần hoặc vài lần. Và cho rằng bạn có thể sử dụng một POJO đơn giản và gọi nó từ một tuyến Camel,

Ví dụ một phương thức trong POJO chuyển đổi một chuỗi thành phiên bản MyOrder.

public MyOrder doSomething(String data) { 
    ... 
    return ... 
} 

Và sau đó sử dụng một phương pháp gọi trong máy biến áp thông điệp trong con đường

.transform().method(MyBusinessClass.class, "doSomething") 

Mặc dù sử dụng bất kỳ cách nào Camel cho chuyển đổi thông điệp như Jake trả lời, cho phép bạn tích hợp liền mạch này vào Camel và sử dụng nó như một công dân hạng nhất vì nó đã được cung cấp ra khỏi hộp từ Camel chính nó. Và cho phép bạn sử dụng lại điều đó trong các tuyến đường khác và ứng dụng Camel.

Việc triển khai org.apache.camel.Expression để chuyển tải trọng tải thư mặc dù không thường được sử dụng. Có những cách tốt hơn như Jake nói. Hoặc sử dụng POJO như hình trên. Mặc dù POJO ở trên được đánh giá cuối cùng dưới dạng org.apache.camel.Expression và do đó bạn có thể triển khai một lần và sử dụng chính nó.

Nếu bạn có một bản sao của cuốn sách Camel in Action, thì chương 3 là tất cả chuyển đổi dữ liệu bằng Camel.

Các vấn đề liên quan