Giới thiệu về DataWeave trong Mule ESB

Trong Mule ESB, ngoài các transformer có sẵn như Byte Array to String, Object to JSON, XML to JSON,… chúng ta còn có thể sử dụng DataWeave để transform những dạng dữ liệu phức tạp hơn, từ input cho đến output, một cách linh hoạt. Trong bài viết này, mình sẽ giới thiệu với các bạn một số kiến thức cần biết về DataWeave và một ví dụ đơn giản về cách sử dụng DataWeave để tranform dữ liệu từ CSV format sang XML format các bạn nhé!

DataWeave giúp cho việc tranformation từ định dạng dữ liệu này sang định dạng dữ liệu khác một cách dễ dàng. Nó là một ngôn ngữ được sử dụng để query và transform những dữ liệu phức tạp. Code của DataWeave giống như JSON syntax và chúng ta có thể gọi các function viết bằng Java hay Groovy bên trong DataWeave.

DataWeave hỗ trợ nhiều loại data format khác nhau như XML, JSON, CSV…

Trong Anypoint Studio, chúng ta có thể sử dụng Transform Message Component để query và transform data sử dụng DataWeave.

Để các bạn có cái nhìn rõ hơn về DataWeave, mình sẽ làm một ví dụ đơn giản sử dụng Transform Message Component với DataWeave để transform dữ liệu ở định dạng CSV sang định dạng XML.

Dữ liệu CSV của mình có định dạng như sau:

Còn định dạng XML mà mình mong muốn nhận được sẽ là:

OK, đầu tiên mình sẽ tạo mới một Mule ESB Maven project để làm ví dụ. Sau đó, mình sẽ tạo 2 tập tin example.csv và example.xml để chứa data trước và sau khi transform. Cả 2 tập tin này mình sẽ bỏ vào thư mục /src/main/resources/examples/ của project.

Project của mình sẽ có cấu trúc như sau:

Giới thiệu về DataWeave trong Mule ESB

Nếu bạn nào chưa biết cách tạo Mule ESB Maven project thì có thể tham khảo bài viết này.

Tập tin mule-esb-dataweave-csv-xml.xml sẽ chứa Mule Flow chính trong ví dụ của chúng ta.

Mule Flow sẽ có nội dung như sau:

Giới thiệu về DataWeave trong Mule ESB

Trong đó:

  • HTTP Listener Connector: dùng để client có thể truyền dữ liệu ở định dang CSV trong phần body của HTTP request.
  • Byte Array to String Transformer dùng để convert dữ liệu ở dạng binary trong phần body của HTTP request sang String dưới dạng CSV.
  • Tranform Message Component dùng để convert dữ liệu dưới dạng CSV sang định dạng XML.
  • Logger Component: dùng để in ra nội dung XML sau khi convert.

HTTP Listener Connector được cấu hình (với base URL: http://localhost:8081/mule-esb/) như sau:

Giới thiệu về DataWeave trong Mule ESB

Mọi người có thể tham khảo thêm phần cấu hình của HTTP Listener Connector tại đây.

Phần Byte Array to String thì không có gì phải cấu hình cả.

Phần Logger Component thì cấu hình đơn giản như sau để in ra payload:

Giới thiệu về DataWeave trong Mule ESB

Quan trọng nhất ở đây là phần Transform Message Component.

Mặc định, Transform Message Component sẽ có cấu hình như sau:

Giới thiệu về DataWeave trong Mule ESB

Như các bạn thấy, ở đây chúng ta có 3 phần: Input, Output và một phần hiển thị Data Weave script.

Chúng ta sẽ chỉ sử dụng phần Input và Output trong trường hợp các bạn có thể định nghĩa được dữ liệu trước và sau transform thành những cấu trúc cố định, hoặc là các bạn có sample data cho chúng. Trong trường hợp này, các bạn có thể sử dụng hai phần này để generate Data Weave script bằng việc kéo và thả. Trường hợp còn lại, chúng ta không định nghĩa được được cấu trúc của data cho Input và Output, thì các bạn cần phải viết Data Weave script.

Bởi vì mình đã có sample data trước và sau transform nên trong ví dụ này, mình sẽ sử dụng phần Input và Output để generate Data Weave script các bạn nhé.

Phần Input sẽ là nơi cho phép chúng ta có thể định nghĩa dữ liệu mà chúng ta sẽ sử dụng để transform ra output.

Tất cả những dữ liệu có thể là Input bao gồm Payload của Mule Message, Flow Variables, Session Variables và những Inbound Properties.

Với phần Payload, chúng ta có thể định nghĩa bất kỳ định dạng dữ liệu nào. Như các bạn thấy, chúng ta có phần Define metadata trong phần Payload của Input. Nếu các bạn click vào phần này, các bạn sẽ thấy cửa sổ sau:

Giới thiệu về DataWeave trong Mule ESB

Cửa sổ này cho phép chúng ta có thể định nghĩa dữ liệu cho phần Payload, nghĩa là bạn mặc định khi xử lý đến Transform Message Component thì dữ liệu của Payload sẽ có định dạng dữ liệu này. Ví dụ ở đây của mình là định dạng CSV, thì khi xử lý đến Transform Message Component thì dữ liệu sẽ là định dạng CSV.

Ở đây, Mule cho phép chúng ta định nghĩa Metadata cho CSV bằng một tập tin luôn. Các bạn hãy nhấn nút Add để tạo mới type cho CSV.

Giới thiệu về DataWeave trong Mule ESB

Nhấn nút Create type để hoàn tất nhé các bạn.

Trong ô Type, các bạn sẽ thấy có nhiều loại data được hỗ trợ trong Mule ESB.

Giới thiệu về DataWeave trong Mule ESB

Các bạn hãy chọn Csv trong ô Type, rồi chọn Sample File trỏ đến tập tin chứa nội dung CSV file mà chúng ta muốn transform. Khi đó, các bạn sẽ thấy cửa sổ Metadata type như sau:

Giới thiệu về DataWeave trong Mule ESB

Nhấn nút Select để hoàn thành việc định nghĩa phần Metadata cho Payload trong phần Input của Transform Message Component nhé các bạn.

Lúc này, các bạn sẽ thấy phần Input của Transform Message Component như sau:

Giới thiệu về DataWeave trong Mule ESB

Như vậy là chúng ta đã định nghĩa xong cho phần Input. Như các bạn thấy, phần data cho Payload đã được định dạng theo một cấu trúc như sample data của chúng ta.

Phần Output của chúng ta, các bạn cũng có thể nhấn vào nút Define metadata để định nghĩa cấu trúc của Output theo sample data như phần Input.

Các bạn hãy làm tương tự với sample data là tập tin example.xml trong thư mục /src/main/resources nhé!

Kết quả của mình như sau:

Giới thiệu về DataWeave trong Mule ESB

Lúc này, phần Input và Output của Transform Message Component có nội dung như sau các bạn:

Giới thiệu về DataWeave trong Mule ESB

Bây giờ các bạn có thể drap thuộc tính ID của phần Input và drop vào thuộc tính ID trong phần Output như sau để map transform cho chúng như sau:

Giới thiệu về DataWeave trong Mule ESB

Làm tương tự cho thuộc tính Name và Age nhé các bạn.

Kết quả:

Giới thiệu về DataWeave trong Mule ESB

Nếu quan sát phần Data Weave script, các bạn sẽ thấy nó được generate với nội dung như sau:

Đây chính là Data Weave script mà nếu nó không được generate bằng việc kéo thả phần Input với phần Output thì chúng ta phải viết để transform nội dùng từ CSV sang XML đó các bạn.

Thử phân tích nội dung của Data Weave script này xí nha các bạn!

Đầu tiên, chúng ta cần phải khai báo:

để chỉ định output sẽ là định dạng XML.

Đi từ ngoài vào trong, cái đầu tiên chúng ta cần của output là thẻ root <students>, do đó code đầu tiên của chúng ta cần viết là:

Ứng với mỗi dòng trong tập tin CSV, chúng ta sẽ tạo ra một thẻ <student>, do đó ở đây chúng ta sẽ dùng toán tử map để foreach từng dòng trong tập tin CSV và tạo ra thẻ <student>:

Biến payload01 sẽ là đối tượng chứa thông tin cho mỗi dòng trong tập tin CSV và để in ra ID, Name, Age chúng ta sẽ viết như sau:

Tới đây thì chúng ta đã hoàn thành DataWeave script để transform dữ liệu CSV sang định dạng XML.

Các bạn có thể nhấn nút Preview để xem kết quả:

Giới thiệu về DataWeave trong Mule ESB

Giờ thì chúng ta có thể chạy ứng dụng Mule ESB của chúng ta và sử dụng Postman để kiểm tra kết quả:

Giới thiệu về DataWeave trong Mule ESB

 

Add Comment