Chương 4 Cài đặt thử nghiệm hệ thống đấu giá
4.2. JADE Platform
4.2.3. Ví dụ minh họa truyền thông ACL
Chúng ta hãy xem xét chi tiết cách thức truyền thông điệp giữa hai Agent đã đảm nhận hai role Bidder và Auctioneer trong một hệ đấu giá.
Trong hệ thống đấu giá,thông điệp CFP được sử dụng để thực hiện việc Auctioneer gửi giá đề nghị cho mặt hàng chào bán tới các Bidder. Thông điệp PROPOSE có thể được Bidder sử dụng để chứa lời xác nhận sẵn sàng trả giá Auctioneer đã đặt ra cho mặt hàng. Thông điệp ACCEPT_PROPOSAL để thể hiện việc Auctioneer chấp nhận lời trả giá của Bidder.
ACLMessage msgACL = new ACLMessage(ACLMessage.REQUEST); msgACL.addReceiver(addressee.getAgent());
try {
msgACL.setContentObject(msgR); } catch (java.io.IOException ioe) {
System.err.println(ioe); throw new RoleException(); }
myAgent.send(msgACL);
4.3. Cài đặt role
Role được cài đặt bằng một lớp trừu tượng trong đó các tính năng của role được biểu diễn dưới dạng các trường tĩnh và phương thức tĩnh [15]. Lớp biểu diễn role có tên trùng với tên của role và là một phần của gói (package) biểu diễn ngữ cảnh ứng dụng của role đó. Ví dụ, ở hệ thống eAuction là gói auction.
package rolesystem.roles.auction; import rolesystem.core.RoleAction; import rolesystem.roles.KnownEvent; /**
This role is the bidder of an auction. Keywords: auction, bidder.
*/
public abstract class Bidder {…}
Mỗi hành động được biểu diễn bởi một phương thức tĩnh, có nhiệm vụ tạo ra một thể hiện thích hợp của lớp RoleAction và trả nó về cho đối tượng gọi phương
thức đó. Tên của phương thức tĩnh này cũng trùng với tên của hành động tương ứng và có thể có một hoặc hai tham số: tham số thứ nhất là địa chỉ của Agent nhận sự kiện tương ứng với hành động, tham số thứ hai (có thể có hoặc không) là nội dung thông tin để thực thi hành động. Ví dụ, dưới đây là mã nguồn cài đặt hành động trả giá (bid) của Bidder.
public static RoleAction bid(Id addressee,Price content) { return new RoleAction("bid", addressee,content);}
Đối với sự kiện, ta có hai lớp cài đặt sự kiện khác nhau. Một là lớp RoleEvent, lớp kia là KnownEvent. Lớp RoleEvent biểu diễn các sự kiện được Server Agent dịch từ hành động mà nó nhận được từ Agent. Lớp này cài đặt các sự kiện với các thông tin như: tên của sự kiện, ID của Agent gửi, role mà Agent gửi đang đảm nhận và lớp nội dung thông tin của sự kiện.
public class RoleEvent implements Serializable {
private String name; private int sender;
private String senderRole; private Serializable content; ….
}
Lớp thứ hai cài đặt sự kiện là lớp KnownEvent, thể hiện các sự kiện nằm trong phạm vi xử lý của một role nào đó. Mỗi một sự kiện là instance của lớp RoleEvent cũng sẽ có một sự kiện tương tự là instance lớp KnownEvent. Với cùng một sự kiện, tên của các instance ở hai lớp này là giống nhau, instance của lớp KnownEvent có thêm kí tự KE ở trước để phân biệt. Ví dụ, sự kiện bid là instance
của lớp RoleEvent, ta sẽ có một instance tương ứng của lớp KnownEvent là
KE_bid.
Các sự kiện một role có thể nhận biết là instance của lớp KnownEvent, được khai báo dưới dạng các trường dữ liệu tĩnh. Ví dụ, sự kiện bid mà Auctioneer nhận được dưới đây:
public static final KnownEvent KE_bid=new KnownEvent("bid", Bidder.ROLE_ID, Price.class);
Mối quan hệ giữa các lớp được thể hiện qua lược đồ dưới đây:
Hình 4.6. Lược đồ quan hệ giữa các lớp trong hệ Auction.
Như đã trình bày ở chương 3, việc cài đặt role bằng ngôn ngữ Java có thể được thực hiện dễ dàng và nhanh chóng hơn nhờ các tài liệu XRole. Bằng cách dùng các XSL thích hợp, ta có thể chuyển các định nghĩa role Seller, Bidder và Auctioneer tương ứng thành các lớp trừu tượng như dưới đây:
public abstract class Seller {
String description="role to make resources available"; String keyword[]= {"seller", "auction"};
/*Request to put the good on sale*/
public static RoleAction ReqOnSale(AgentID addressee); /*Put the good to be sold on sale*/
public static RoleAction putGoodOnSale(String Good_ID, String Description);
/*Auctioneer accept seller's request or not*/
public static final KnownEvent KE_acceptSale(AgentID addressee); /*the good cannot be sold at the auction*/
public static final KnownEvent KE_unSold(AgentID addressee); /*payment from the auctioneer*/
public static final KnownEvent KE_pay(AgentID addressee, String content);
}
Hình 4.7. Mã nguồn Java tương ứng với Seller.xml.
Role A (Abstract) ROLE_ID:String=Auction x RoleA KE_A: KnownEvent KE_B: KnownEvent … ActionA: RoleAction ActionB: RoleAction Auction KnownEvent RoleAction
public abstract class Auctioneer {
String description="role to control the auctions"; String keyword[]= {"Auctioneer", "auction"};
/*notify requesting bidders the current goods on sale*/
public static RoleAction notifyGood(AgentID addressee, string content); /*notify bidders the current situation*/
public static RoleAction notifySituation(AgentID addressee, string content);
/*notify bidders the final winner*/
public static RoleAction youWon(AgentID addressee, Price content); /*request to put goods on sale from sellers*/
public static final KnownEvent KE_reqOnSale(AgentID sender); /*put goods on sale*/
public static final KnownEvent KE_putGoodOnSale(AgentID sender, string content);
/*bidder ask about the current goods*/
public static final KnownEvent KE_askGood(AgentID sender); /*ask about the current situation of the auction*/
public static final KnownEvent KE_askSituation(AgentID sender, string content);
/*bid from the bidders*/
public static final KnownEvent KE_bid(AgentID sender, string content); }
Hình 4.8. Mã nguồn Java tương ứng với Auctioneer.xml
public abstract class bidder {
public string description="role to make a bid for the good "; public string keyword[]= {"bidder"};
/*ASK AUCTIONEER ABOUT GOODS ON SALE*/
public static RoleAction askGood(AgentID addressee); public static RoleAction askSituation(AgentID addressee); /*make a bid for the good interested*/
public static RoleAction bid(AgentID addressee, Price content); /*PAY THE MONEY TO AUCTIONEER*/
public static RoleAction pay(AgentID addressee, Money content); /*Auctioneer notify the requested bidder the current price*/
public static final KnownEvent KE_notifySituation(String content); /*sellers notify the winning bidder about the win*/
public static final KnownEvent KE_youWon(AgentID addressee, String content);
}
Tuy nhiên, những mã nguồn Java này mới chỉ là khung của các lớp cài đặt role tương ứng. Nội dung cài đặt chi tiết cho từng role, chúng ta sẽ tiếp tục hoàn thiện trong quá trình cài đặt thực sự. Sau đây là một phần mã nguồn cài đặt role Bidder.
...
public static final KnownEvent KE_askSituation=new KnownEvent("askSituation", Bidder.ROLE_ID);
/**
A bidder makes a bid. Sender role: Bidder Content: Bid.
*/
public static final KnownEvent KE_bid=new KnownEvent("bid", Bidder.ROLE_ID, Price.class);
/**
A bidder pays. Sender role: Bidder Content: Payment. */
public static final KnownEvent KE_pay=new KnownEvent("pay", Bidder.ROLE_ID, Money.class);
/**
Notifies to a seller that its sale has been accepted. @param addressee Seller
*/
public static RoleAction saleAccepted(int addressee) {
return new RoleAction("saleAccepted", addressee); }
... }
Hình 4.10. Mã nguồn Java cài đặt Bidder