Một trong số các đặc trưng quan trọng của tác tử JADE là khả năng truyền thông. Kiểu truyền thông của tác tử JADE là truyền thông báo không đồng bộ.
Mỗi tác tử có một hàng đợi thông báo, đây là nơi mà thực thi JADE sẽ chuyển thông báo từ các tác tử khác vào, bất kỳ khi nào một thông báo được chuyển vào hàng đợi thì tác tử nhận được báo tin. Khi tác tử nhận lấy thông báo từ trong hàng đợi thông báo để xử lý thì việc truyền thông kết thúc.
Hình 2.3. Mô tả truyền thông báo không đồng bộ
Tạo thông báo gửi tới A2
Gửi thông báo
Thực thi JADE phân tán
Lấy thông báo từ hàng đợi và xử lý
Chuyển thông báo vào trong hàng đợi của A2
Ngôn ngữ ACL [24] : Thông báo các tác tử JADE sử dụng để trao đổi với nhau có khuôn dạng được đặc tả bằng ngôn ngữ ACL do chuẩn quốc tế FIPA15 định nghĩa. Khuôn dạng này gồm có một số trường mô tả như sau: - Tác tử gửi thông báo (sender)
- Danh sách tác tử nhận thông báo (receivers)
- Mục đích truyền thông (còn gọi là biểu hiện) cho biết tác tử gửi có ý định muốn gì qua thông báo gửi. Biểu hiện có thể là REQUEST, nếu tác tử gửi muốn tác tử nhận thực hiện một hành động, INFORM, nếu tác tử gửi muốn tác tử nhận quan tâm sự kiện xảy ra,...
- Nội dung thông báo (content) : là thông tin thật bao gồm trong thông báo như: nó là hành động được thực hiện trong thông báo REQUEST hoặc là sự việc tác tử gửi muốn phơi bầy trong một thông báo INFROM ,...
- Ngôn ngữ nội dung (content language) : là cú pháp sử dụng để trình bầy nội dung(cả hai tác tử gửi và tác tử nhận có thể mã hóa/phân tách theo cú pháp này để việc truyền thông có hiệu quả).
- Bản thể (ontology) : Từ vựng của các ký hiệu sử dụng trong nội dung và ý nghĩa của chúng(cả hai tác tử gửi và tác tử nhận phải gán cho các ký hiệu cùng ý nghĩa để việc truyền thông hiệu quả).
- Một vài trường sử dụng để kiểm soát vài cuộc nói chuyện cùng một lúc và định rõ thời gian kết thúc cho một phúc đáp như : conversation-id, reply- with, in-reply-to, reply-by.
Một thông báo trong JADE là một đối tượng của lớp ACLMessage, lớp ACLMessage cung cấp các phương thức set() và get() để điều khiển tất cả các trường của thông báo
Gửi thông báo : Việc gửi thông báo tới một tác tử khác đơn giản là điền đủ thông tin vào các trường của một đối tượng ACLMessage, sau đó gọi phương thức send() của lớp Agent. Đoạn mã lệnh sau minh họa một tác
tử có nickname là Peter gửi đi một thông báo có nội dung là today it's raining
ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("Peter", AID.ISLOCALNAME)); msg.setLanguage("English");
msg.setOntology("Weather-forecast-ontology"); msg.setContent("Today it’s raining");
send(msg);
Nhận thông báo : Thực thi JADE tự động chuyển các thông báo vào trong hàng đợi riêng của tác tử nhận ngay sau khi các thông báo đến. Một tác tử có thể lấy thông báo từ hàng đợi của nó bằng phương thức receive(). Phương thức này trả lại thông báo đầu tiên trong hàng đợi (đồng thời loại bỏ nó khỏi hàng đợi) hoặc là null nếu hàng đợi rỗng. Đoạn mã sau minh họa việc nhận thông báo.
ACLMessage msg = receive(); if (msg != null) {
// Process the message }
2.4.5. Di chuyển tác tử
JADE cho phép xây dựng các tác tử di động, chúng có thể di chuyển hoặc nhân bản. Các phiên bản hiện tại của JADE chỉ hỗ trợ di chuyển tác tử trong cùng một nền, tức là tác tử di động chỉ có thể di chuyển được từ bộ chứa tác tử này sang một bộ chứa tác tử khác nhưng các bộ chứa này phải thuộc cùng một nền. Sự di chuyển hay nhân bản được xem như một sự chuyển trạng thái trong vòng đời của tác tử. Giống như toàn bộ thao tác vòng đời khác, sự di chuyển hoặc nhân bản tác tử có thể được bắt đầu bởi bản thân tác tử hoặc bởi AMS. Trước khi di chuyển tác tử di động cần phải biết các thông tin về bộ chứa đích. JADE cung cấp bản thể gọi là
jade-mobility-ontology, chứa các khái niệm và các hành động cần thiết. Các phương thức cho sự di chuyển của tác tử di động được chứa trong gói jade.domain.mobility
Giao diện lập trình ứng dụng JADE cho việc di chuyển tác tử : Có hai phương thức công khai là doMove() và doClone() của lớp Agent cho phép một tác tử JADE di chuyển hoặc nhân bản (sao chép bản thân tác tử dưới một tên khác đến một bộ chứa khác). Phương thức doMove() cần một
tham số có kiểu jade.core.Location, biểu diễn đích dự định đến của
tác tử. Phương thức doClone() cần có hai tham số, tham số thứ nhất là jade.core.Location, biểu diễn đích dự định sao chép bản thân tác tử đến, tham số thứ hai là một đối tượng của lớp String biểu diễn tên của tác tử mới được sao chép đến. Bởi vì jade.core.Location là một giao diện trừu tượng, do đó các tác tử không được phép tạo ra location của riêng chúng mà chúng phải hỏi AMS về danh sách các location hiện có và chọn lấy một đích đến. Một tác tử JADE cùng có thể hỏi AMS để biết location của một tác tử khác đang ở.
Việc di chuyển tác tử là gửi mã lệnh và trạng thái của nó qua mạng, vì vậy người dùng định nghĩa tác tử di động phải quản lý tiến trình tuần tự hóa và giải tuần tự hóa. Trong số các tài nguyên mà tác tử đang sử dụng sẽ có tài nguyên được di chuyển theo tác tử, có tài nguyên bị tác tử ngắt kết nối trước khi di chuyển và kết nối trở lại khi tác tử đến đích. JADE xây dựng sẵn hai phương thức trong lớp Agent cho việc quản lý tài nguyên
Khi tác tử di chuyển, phương thức beforeMove() được gọi tại nơi xuất phát khi thao tác di chuyển thành công, do đó thể hiện (instance) tác tử di chuyển đến bộ chứa đích chuẩn bị được kích hoạt và thể hiện tác tử gốc chuẩn bị đình chỉ hoạt động. Vì vậy, phương thức này có quyền giải phóng bất kỳ tài nguyên cục bộ nào mà thể hiện tác tử gốc sử dụng (như đóng file và GUI đã mở), nếu các tài nguyên này đã được đóng nhưng việc di chuyển thất bại, tác tử sẽ yêu cầu mở lại chúng. Bất kỳ thông tin nào được truyền bởi tác tử đến bộ chứa đích, phải được thiết lập trước khi phương thức doMove() được gọi. Việc thiết lập thuộc tính tác tử thể hiện trong phương
thức beforeMove() sẽ không gây ảnh hưởng đến thể hiện di chuyển. Phương thức afterMove() được gọi tại bộ chứa đích ngay khi sau tác tử đến đích thành công (nhưng bộ lập lịch hành vi chưa được khởi động lại).
Để nhân bản tác tử, JADE hỗ trợ cặp phương thức beforeClone() và afterClone(), hai phương thức này được gọi giống như trong tình huống của cặp phương thức beforeMove() và afterMove() ở trên. Bốn phương thức này thuộc lớp Agent có mức độ kiểm soát truy cập protected và không có tham số. Khi xây dựng tác tử di động có thể viết đè bốn phương thức này nếu cần.
Bản thể (ontology) di chuyển JADE [25] : Bản thể jade-mobility-ontology
chứa tất cả các khái niệm và các hành động cần thiết hỗ trợ cho việc di chuyển tác tử. JADE cung cấp lớp MobilityOntology, nó hoạt động như một "con bài độc nhất" và cho phép truy nhập vào thể hiện dùng chung
của ontoloy mobility JADE thông qua phương thức getInstance().
Bản thể Ontology kế thừa từ JADEManagementOntology, chứa năm khái niệm, hai hành động và một lớp thích hợp của gói jade.domain.mobility, kết hợp với mỗi khái niệm hoặc hành động . Các bảng sau đây trình bầy tất cả các khái niệm, các hành động và lược đồ của chúng
- Mobile-agent-description : Mô tả một tác tử di động di chuyển
- mobile-agent-profile : Mô tả môi trường cần thiết cho tác tử di
động. Nó được biểu diễn bằng lớp MobileAgentProfile
- mobile-agent-system : Mô tả hệ thống thực thi tác tử di động sử
dụng. Nó được biểu diễn bằng lớp MobileAgentSystem
- mobile-agent-language : Mô tả ngôn ngữ lập trình tác tử di động sử
dụng. Nó được biểu diễn bằng lớp MobileAgentLanguage
- mobile-agent-os : Mô tả hệ điều hành tác tử di động cần. Nó được
biểu diễn bằng MobileAgentOS
- move-agent : Hành động di chuyển của tác tử từ nơi này đến nơi khác. Nó được biểu diễn bằng lớp MoveAction. Hành động này yêu cầu bắt buộc phải có một tham số vô danh thuộc kiểu mobile-agent-description.
- clone-agent : Hành động thực hiện một bản sao của một tác tử có thể chạy trên một nơi khác. Nó được biểu diễn bằng lớp CloneAction. Hành động này yêu cầu bắt buộc phải có hai tham số: tham số thứ nhất có kiểu mobile-agent-description và tham số thứ hai có kiểu String Truy nhập AMS để di chuyển tác tử : AMS JADE có vài mở rộng hỗ trợ di
chuyển tác tử và có khả năng thực hiện hai hành động hiện tại trong jade- mobility-ontology. Mọi hành động liên quan đến di chuyển có thể yêu cầu đến AMS thông qua một giao thức FIPA-request cùng với jade-mobility- ontology là giá trị ontology cùng với FIPA-SL0 là giá trị language (ngôn ngữ)
Hành động move-agent cần một tham số có kiểu mobile-agent-
description. Hành động này chuyển định danh tác tử bằng các tham số name và address của mobile-agent-description từ nơi hiện thời vào tham số destination. Ví dụ một tác tử tên là Peter muốn di chuyển đến nơi tên là Fron-End, nó phải gửi thông báo ACL request sau đến AMS
(REQUEST
:sender (agent-identifier :name RMA@Zadig:1099/JADE) :receiver (set (agent-identifier :name
ams@Zadig:1099/JADE)) :content (
(action (agent-identifier :name ams@Zadig:1099/JADE) (move-agent (mobile-agent-description
:name (agent-identifier :name Johnny@Zadig:1099/JADE) JADE Programmer’s GUIDE 48 :destination (location :name Main-Container :protocol JADE-IPMT :address Zadig:1099/JADE.Main-Container ))))) :reply-with Req976983289310 :language FIPA-SL0 :ontology jade-mobility-ontology :protocol fipa-request :conversation-id Req976983289310 )
Đầu tiên, tác tử phải tạo ra một đối tượng MoveAction mới, điền đầy
đủ tham số của nó với một đối tượng MobileAgentDescription phù
hợp, điền đủ tên và địa chỉ của tác tử di chuyển và đích đến (location)
của tác tử. Sau đó gọi phương thức Agent.getContenManager()
.fillContent(..,..) để chuyển đối tượng Java MoveAction thành một String và ghi vào tham số content của thông báo ACL request phù hợp.
Hành động clone-agent cũng hoạt động tương tự nhưng bổ sung thêm một tham số kiểu String biểu diễn tên của tác tử mới được nhân bản.
AMS cũng hỗ trợ bốn hành động liên quan đến việc di chuyển định nghĩa trong JADEManagementOntology. Các hành động này được mô tả như sau :
- Hành động where-is-agent có một tham số thuộc kiểu AID là định danh của tác tử cho biết vị trí hiện thời của nó. Hành động này trả lại tên của nơi (location) tác tử đang ở, tên này được chuyển cho tham số content của thông báo ACL inform. Ví dụ thông báo request hỏi nơi tác tử Perter đang ở có nội dung như sau :
(REQUEST
:sender (agent-identifier :name da1@Zadig:1099/JADE) :receiver (set (agent-identifier :name
ams@Zadig:1099/JADE)) :content (( action
(agent-identifier :name ams@Zadig:1099/JADE) (where-is-agent (agent-identifier :name
Peter@Zadig:1099/JADE)) ))
:language FIPA-SL0
:ontology JADE-Agent-Management :protocol fipa-request )
Vị trí (Location) kết quả được chứa trong một thông báo inform như sau :
(INFORM
:receiver (set (agent-identifier :name da1@Zadig:1099/JADE))
:content ((result (action
(agent-identifier :name ams@Zadig:1099/JADE) (where-is-agent (agent-identifier :name
Peter@Zadig:1099/JADE)) ) (set (location :name Container-1 :protocol JADE-IPMT :address Zadig:1099/JADE.Container-1 )) )) :reply-with da1@Zadig:1099/JADE976984777740 :language FIPA-SL0 :ontology JADE-Agent-Management :protocol fipa-request )
- Hành động query-platform-locations không có tham số, kết quả
trả về là tất cả các nơi chứa tác tử (Location) đang hoạt động trong nền (JADE platform) hiện thời. Thông báo cho hành động này chỉ đơn giản như sau:
( REQUEST
:sender (agent-identifier :name Johnny)
:receiver (set (Agent-Identifier :name AMS))
:content (( action (agent-identifier :name AMS) ( query- platform-locations ) ))
:language FIPA-SL0
:ontology JADE-Agent-Management :protocol fipa-request
)
Nếu nền hiện thời có ba bộ chứa (container) tác tử, AMS sẽ gửi lại thông báo inform sau :
( INFORM
:sender (Agent-Identifier :name AMS)
:receiver (set (Agent-Identifier :name Johnny))
:content (( Result ( action (agent-identifier :name AMS) ( query-platform-locations ) ) (set (Location
:name Container-1 :transport-protocol
(Location :name Container-2 :protocol JADE-IPMT :address IOR:000….Container-2 ) (Location :name Container-3 :protocol JADE-IPMT :address IOR:000….Container-3 ) ))) :language FIP :ontology JADE-Agent :protocol fipa-request )
Lớp Location thực thi giao diện jade.core.Location, do đó nó có
thể được chuyển tới các phương thức Agent.doMove() và
Agent.doClone(). Trường hợp tổng quát, một tác tử JADE hỏi AMS để nhận được tất cả các location đang hoạt động, sau đó sẽ quyết định nơi và khi nào di chuyển.