Sự giao tiếp giữa các tác tử – lớp ACLMessage

Một phần của tài liệu QUẢN Lý d6cntt epu dai (Trang 54 - 56)

c, Chức năng xóa khu đất đấu giá

3.3.3 Sự giao tiếp giữa các tác tử – lớp ACLMessage

Một trong những đặc điểm quan trọng của JADE tác tử là chúng có khả năng để giao tiếp với nhau. Mô hình giao tiếp ở đây là mô hình asynchronous messgage

passing (tạm dịch là truyền lời nhắn không đồng bộ). Mỗi tác tử sẽ có một hòm thư

(hàng đợi để lưu các lời nhắn của tác tử), các lời nhắn từ các tác tử khác đến sẽ được lưu ở đó. Bất cứ khi nào có một lời nhắn đến thì tác tử nhận sẽ được thông báo. Khi một tác tử lấy một lời nhắn ra để xử lý, việc xử lý lời nhắn đó như thế nào sẽ hoàn toàn phụ thuộc vào tác tử đã được lập trình như thế nào.

- Ngôn ngữ ACL

Các lời nhắn trao đổi giữa các tác tử với nhau có định dạng được viết bằng ngôn ngữ ACL. Ngôn ngữ này được định nghĩa bởi FIPA (http://www.fipa.org). Định dạng này bao gồm một số trường và cụ thể là:

• Tác tử gửi lời nhắn

• Một danh sách các tác tử nhận

• Mục tiêu giao tiếp cái chỉ ra rằng tác tử gửi muốn làm gì khi mà nó gửi lời nhắn đến tác tử nhận. Nó có thể là một REQUEST (yêu cầu) trong trường hợp tác tử gửi muốn tác tử nhận thực hiện một hành động nào đó, là một INFORM (thông báo) trong trường hợp tác tử gửi muốn tác tử nhận nhận biết một điều gì đó, là một QUERY_IF trong trường hợp tác tử gửi muốn biết xem một điều kiện là đúng hay không, là CFP (call for proposal), PROPOSE, ACCEP_PROPOSAL, REJECT_PROPOSAL, nếu như tác tử gửi và tác tử nhận đang kết hợp với nhau trong một thỏa thuận nào đó…

• Phần nội dung: nội dung của lời nhắn

• Ngôn ngữ cho nội dung lời nhắn: là cú pháp được sử dụng để biểu diễn nội dung (cả tác tử nhận lẫn tác tử gửi đều phải có khả năng mã hóa và giải mã các biểu diễn theo cú pháp này để việc giao tiếp trở nên hiệu quả.) • Phần ontology: một tập hợp các từ vựng được sử dụng trong phần nội

dung và nghĩa của chúng (cả tác tử nhận lẫn tác tử gửi phải gắn các nghĩa giống nhau vào các từ trong nội dung để việc giao tiếp trở nên có hiệu quả).

• Một vài trường khác như là conversation-id, reply-with, in-reply-to,

reply-by được sử dụng để điều khiển các cuộc hội thoại diễn ra đồng thời

và để chỉ định thời gian timeout cho việc nhận một câu trả lời.

Một lời nhắc trong JADE được cài đặt như một đối tượng của lớp jade.lang.acl.ACLMessage. Lớp này cung cấp các phương thức get() và set() để xử lý các trường trong một lời nhắn.

- Gửi lời nhắn

Gửi một lời nhắn đến một tác tử khác chỉ đơn giản là điền thông tin vào các trường của một đối tượng của lớp ACLMessage và sau đó gọi phương thức send của lớp Tác tử.

Sử dụng lời nhắn trong chương trình:

Các tác tử Auctioneer sẽ gửi các lời nhắn CFP (call for proposal) cho các tác tử Bidder để yêu cầu về thông tin đặt giá khu đất. Các tác tử Bidder sẽ trả lời lại các tác tử Auctioneer bằng một lời nhắn PROPOSE chứa thông tin đặt giá khu đất. Sau đó, tác tử Auctioneer sẽ gửi một lời nhắn ACCEPT_PROPOSAL đến tác tử Bidder để cho tác tử Bidder biết tác tử Auctioneer đã đồng ý bán cho tác tử Bidder và đang yêu cầu một hóa đơn thanh toán. Trong trường hợp tác tử Bidder thấy giá khởi điểm khu đất lớn hơn số vốn của mình thì tác tử Bidder sẽ gửi một lời nhắn REFUSE tới tác tử Auctioneer.

- Nhận lời nhắn

JADE runtime sẽ tự động lưu lời nhắn được gửi đến đến vào trong hàng đợi của tác tử nhận. Tác tử nhận sẽ lấy các lời nhắn từ hàng đợi của nó bằng phương thức receive(). Phương thức này trả về lời nhắn đầu tiên bên trong hàng đợi (và xóa nó khỏi hàng đợi) hoặc trả về giá trị là null trong trường hợp hàng đợi trống.

Chúng ta cần phải cài đặt các hành vi cho tác tử nhận để xử lý các lời nhắn từ các tác tử khác gửi tới. Trong chương trình chúng ta sẽ tạo hai hành vi là ReceiveCFPAsComp và ReceiveItemAsWinnerComp để lần lượt xử lý các lời nhắn từ các tác tử Auctioneer gửi tới cho việc lấy thông tin đặt giá khu đất và lấy thông tin hóa đơn. Các hành vi này sẽ chạy liên tục (hành vi loại CYCLIC). Mỗi lần thực hiện phương thức action, nó sẽ kiểm tra xem có lời nhắn nào được nhận từ các tác tử Auctioneer hay không và sau đó xử lý chúng.

- Nhận lời nhắn trong chế độ blocking

Bên cạnh phương thức receive(), lớp tác tử cũng cung cấp một phương thức là blockingReceive(). Nó sẽ không trả về giá trị cho đến khi có một lời nhắn trong hàng đợi của tác tử. Phương thức này có một phiên bản overload là nhận một tham số có kiểu là MessageTemplate (nó sẽ không trả về giá trị cho đến khi có một lời nhắn trong hàng đợi khớp với mẫu).

Phương thức blockingReceive() sẽ thực sự block cái tác tử thread. Vì vậy, nếu chúng ta gọi phương thức blockingReceive() từ bên trong một hành vi, điều này sẽ làm cản trở các hành vi khác được thực hiện cho đến khi phương thức này trả về giá trị. Trong thực tế, chúng ta sẽ sử dụng phương thức blockingReceive() trong các phương thức setup() và takeDown() của tác tử, và thay vào đó sẽ sử dụng phương thức

receive() kết hợp với phương thức block() của lớp Behaviour bên trong một hành vi.

Một phần của tài liệu QUẢN Lý d6cntt epu dai (Trang 54 - 56)

Tải bản đầy đủ (DOCX)

(66 trang)
w