Trong bài viết trước, mình đã hướng dẫn các bạn làm thế nào để tạo mới Anypoint Connector Project để bắt đầu tạo mới custom Connector và sử dụng trong Mule application của mình. Trong bài viết này, mình sẽ đi vào chi tiết cách viết Connector sử dụng Devkit trong Anypoint Studio các bạn nhé!
OK, bắt đầu nào các bạn…
Nếu các bạn để ý, sau khi chúng ta tạo xong Anypoint Connector Project, Anypoint Studio đã tạo cho chúng ta một Connector để làm ví dụ.
Bây giờ, hãy thử install Connector ví dụ này vào Anypoint Studio xem sao nhé các bạn.
Để install một customer Connector vào Anypoint Studio từ một Anypoint Connector Project, các bạn chỉ cần click chuột phải lên project này, rồi chọn Anypoint Connector, sau đó chọn tiếp Install or Update.
Sau đó, kiểm tra kết quả bằng cách tìm trong cửa sổ Mule Palete, sử dụng tên mà chúng ta đã đặt cho Connector lúc tạo project.
Trong ví dụ của mình, tên của Connector là HuongDanJava, và đây là kết quả (lưu ý là các bạn phải tạo mới một Mule project rồi mở tập tin Mule Design thì Mule Palete mới hiện các component, connector lên được):
Khi các bạn kéo và thả custom Connector vào Mule flow, các bạn sẽ thấy cửa sổ cấu hình chính dành cho Connector này như sau:
Trong phần Connector Configuration, nhấp vào biểu tượng dấu + các bạn sẽ mở được phần Global Configuration của Connector này.
Cũng trong cửa sổ cấu hình chính, nếu các bạn chọn vào phần Operation, các bạn sẽ thấy một operation là Greet.
Đó chính là tất cả các thành phần của một custom Connector, cụ thể từng phần sẽ viết code như thế nào, hãy cùng tìm hiểu tiếp nhé các bạn.
Cấu hình chính của custom Connector
Đó chính là phần này nè các bạn!
Tương ứng trong code là class được đánh dấu với annotation @Connector đó các bạn. Ở đây, trong ví dụ của mình đó chính là class HuongDanJavaConnector. Nội dung của class này như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package com.huongdanjava.huongdanjava; import org.mule.api.annotations.Config; import org.mule.api.annotations.Connector; import org.mule.api.annotations.Processor; import com.huongdanjava.huongdanjava.config.ConnectorConfig; @Connector(name = "huong-dan-java", friendlyName = "Huong Dan Java") public class HuongDanJavaConnector { @Config ConnectorConfig config; /** * Custom processor * * @param friend * Name to be used to generate a greeting message. * @return A greeting message */ @Processor public String greet(String friend) { /* * MESSAGE PROCESSOR CODE GOES HERE */ return config.getGreeting() + " " + friend + ". " + config.getReply(); } public ConnectorConfig getConfig() { return config; } public void setConfig(ConnectorConfig config) { this.config = config; } } |
Như các bạn thấy, class HuongDanJavaConnector đã được khai báo với annotation @Connector.
Có hai thuộc tính chúng ta mà chúng ta cần phải khai báo cho một custom Connector trong annotation @Connector, đó chính là thuộc tính “name” và thuộc tính “friendlyName”. Thuộc tính “name” dùng để phân biệt với các Connector khác trong Anypoint Studio, nên nó phải unique, nghĩa là nó không được trùng với những Connector khác đã được cài đặt trong Anypoint Studio, thuộc tính “friendlyName” là tên sẽ hiển thị trong Mule Palete. Các bạn có thể đặt thuộc tính “friendlyName” một tên bất kỳ.
Có nhiều thuộc tính khác trong annotation @Connector như “description” dùng để hiển thị đoạn text khi chúng ta rê chuột vào Connector trong Mule Palete. Các bạn có thể tìm hiểu thêm các thuộc tính này nếu muốn, ở đây mình chỉ giới thiệu 2 thuộc tính bắt buộc cần phải có.
Operation của custom Connector
Trong cửa sổ cấu hình chính của custom Connector, các bạn cũng sẽ thấy phần operation.
Phần này sẽ hiển thị tất cả các operation mà trong code, chúng là những method được đánh dấu với annotation @Processor.
Trong ví dụ của mình thì có 1 operation:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * Custom processor * * @param friend * Name to be used to generate a greeting message. * @return A greeting message */ @Processor public String greet(String friend) { /* * MESSAGE PROCESSOR CODE GOES HERE */ return config.getGreeting() + " " + friend + ". " + config.getReply(); } |
Mặc định thì tên của operation sẽ lấy từ tên của phương thức được đánh dấu với annotation @Processor. Các bạn có thể thay đổi tên mặc định này bằng cách khai báo thêm property friendlyName cho annotation @Processor như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * Custom processor * * @param friend * Name to be used to generate a greeting message. * @return A greeting message */ @Processor(friendlyName = "Hello") public String greet(String friend) { /* * MESSAGE PROCESSOR CODE GOES HERE */ return config.getGreeting() + " " + friend + ". " + config.getReply(); } |
Khi nhấp chọn vào operation Greet trong ví dụ của mình thì một TextField sau sẽ xuất hiện:
Các bạn có thể thấy tên của TextField này chính là tên biến của phương thức greet() trong code của chúng ta. Khi chúng ta điền giá trị cho TextField này, giá trị của nó sẽ được gán vào biến friend trong code đấy các bạn.
Global configuration trong custom Connector
Phần quan trọng đôi lúc không thể thiếu của một Connector đó chính là Global Configuration. Phần này sẽ giúp cho chúng ta có thể sử dụng lại cấu hình của Connector trong nhiều Mule Flow khác nhau. Custom Connector cũng cho phép chúng ta tạo phần Global Configuration để đáp ứng nhu cầu của chúng ta trong một số trường hợp.
Để thêm phần Global Configuration vào custom Connector, chúng ta sẽ khai báo trong class có sử dụng annotation @Connector một biến tham chiếu tới class xử lý cho phần Global Configuration và biến này phải được khai báo kèm với annotation @Config.
Trong class HuongDanJavaConnector thì khai báo này như sau:
1 2 |
@Config ConnectorConfig config; |
Class ConnectorConfig chính là class sẽ xử lý cho phần Global Configuration.
Trong ví dụ của mình thì phần Global Configuration như sau:
Trong khai báo của class ConnectorConfig, chúng ta phải khai báo nó với annotation @Configuration.
Nội dung của class này như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
package com.huongdanjava.huongdanjava.config; import org.mule.api.annotations.Configurable; import org.mule.api.annotations.components.Configuration; import org.mule.api.annotations.param.Default; @Configuration(friendlyName = "Configuration") public class ConnectorConfig { /** * Greeting message */ @Configurable @Default("Hello") private String greeting; /** * Reply message */ @Configurable @Default("How are you?") private String reply; /** * Set greeting message * * @param greeting * the greeting message */ public void setGreeting(String greeting) { this.greeting = greeting; } /** * Get greeting message */ public String getGreeting() { return this.greeting; } /** * Set reply * * @param reply * the reply */ public void setReply(String reply) { this.reply = reply; } /** * Get reply */ public String getReply() { return this.reply; } } |
Như các bạn thấy, trong cửa sổ Global Configuration, chúng ta có 2 field là Greeting và Reply, tương ứng trong code các bạn cũng thấy có hai thuộc tính là greeting và reply. Đây chính là mapping giữa code và giao diện đó các bạn. Khi các bạn nhập giá trị cho 2 field này thì đồng nghĩa giá trị của 2 biến đó cũng được gán tương ứng.
Annotation @Default trong code dùng để gán giá trị mặc định cho 2 field này.
Các bạn cũng có thể thay đổi tên mặc định của 2 field này bằng cách sử dụng annotation @FriendlyName như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package com.huongdanjava.huongdanjava.config; import org.mule.api.annotations.Configurable; import org.mule.api.annotations.components.Configuration; import org.mule.api.annotations.display.FriendlyName; import org.mule.api.annotations.param.Default; @Configuration(friendlyName = "Configuration") public class ConnectorConfig { /** * Greeting message */ @Configurable @Default("Hello") @FriendlyName("Say") private String greeting; /** * Reply message */ @Configurable @Default("How are you?") @FriendlyName("Answer") private String reply; /** * Set greeting message * * @param greeting * the greeting message */ public void setGreeting(String greeting) { this.greeting = greeting; } /** * Get greeting message */ public String getGreeting() { return this.greeting; } /** * Set reply * * @param reply * the reply */ public void setReply(String reply) { this.reply = reply; } /** * Get reply */ public String getReply() { return this.reply; } } |
Sau khi đã viết xong code của mình, các bạn có thể cập nhập thay đổi của Connector với Anypoint Studio bằng cách click chuột phải vào project rồi chọn Anypoint Connector, xong chọn Install or Update…
OK, vậy là mình đã giới thiệu với các bạn một số kiến thức cần thiết để tạo mới một custom Connector trong Mule ESB sử dụng Devkit.
Ở đây, chắc chắn các bạn sẽ còn nhiều nhu cầu khác khi tạo mới một custom Connector, mình sẽ giới thiệu tiếp với các bạn trong các bài viết khác nhé!