Như đã trình bày trong các phần trước, cả lớp initiator và responder đều gọi các phương thức callback khi nhận được các thông điệp. Nếu phải gửi lại một thông điệp phản hồi thì phương thức callback có trách nhiệm tạo thông điệp đó. Tuy nhiên, có những trường hợp để tạo được thông điệp phản hồi, cần phải thực thi một hành vi. Rõ rang là việc này ngăn cản chúng ta sử dụng lớp ContractNetInitiator vì nó không thể thực thi một hành vi trong một phương thức.
Để vượt qua giới hạn này, tất cả các lớp giao thức của JADE đều được cài đặt là các lớp con của lớp FSMBehaviour và mỗi phương thức callback được gọi trong một trạng thái của máy hữu hạn trạng thái. Hình 4.10 chỉ ra máy hữu hạn trạng thái của lớp AchieveREResponder. Nhìn chung, với mỗi phương thức callback mmm() có một phương thức registerMmm() cho phép ghi đè trạng thái gọi phươn gthwcs mmm() bằng một hành vi cụ thể của ứng dụng. Tất cả các phương thức registerMmm() đều có một tham số là đối tượng Behaviour.
Hình 4.10: Máy hữu hạn trạng thái của lớp AchieveREResponder
Bên cạnh các trạng thái dùng để gọi các phương thức callback, còn có các trạng thái khác có trách nhiệm gửi, nhận thông điệp và thực hiện các kiểm tra liên quan đến luồng giao thức. Tuy nhiên, chùng được ẩn đi và người lập trình không cần quan tâm đến. Đường nét đứt trong hình 4.10 chỉ ra cách dữ liệu được chia sẻ giữa các trạng thái của giao thức sử dụng DataStore. Ví dụ, hành vi cài đặt trạng thái Handler-Request của lớp AchieveREResponder như sau:
private class HandleRequest extends OneShotBehaviour { public void action() {
ACLMessage request = getDataStore().get(REQUEST_KEY); ACLMessage response = handleRequest(request);
getDataStore().put(RESPONSE_KEY, response); }
}
Do đó, khi đặng ký một hành vi cụ thể của ứng dụng trong trạng thái của một lớp giao thức, hành vi đó có trách nhiệm lấy các thông điệp đã nhận ở trước và lưu trữ các phản hồi được tạo ra vào DataStore sử dụng các khóa.