Mục tiêu chính của các dịch vụ di động của Jade là được sử dụng một cách đơn giản nhất có thể. Trong trường hợp này, cần thiết phải nạp chồng một số phương thức và gọi các phương thức
doMove() hoặc doClone () của lớp Agent để di chuyển hoặc sao chép các agent (lưu ý rằng
doClone () chỉ có sẵn với dịch vụ di chuyển nội platform). Để chỉ ra đích của một agent di động
hoặc một agent được nhân bản, Jade định nghĩa giao diện jade.core.Location. Hai cài đặt của
giao diện này được cung cấp: jade.core.ContainerID cho di chuyển nội platform và jade.core.PlatformID cho di chuyển liên platform. Các ContainerID phải được khởi tạo với tên
của container đích và địa chỉ vận chuyển của nó. Các PlatformID phải được khởi tạo với agent AID của điều khiển của agent AMS của platform bao gồm địa chỉ vận chuyển của nó.
Để di chuyển một agent khác container hay platform, một hành vi của agent phải bao gồm một lời gọi đến các phương thức doMove (). Phương thức này thay đổi agent của trạng thái
TRANSIT chỉ ra rằng đó là vềdi chuyển. Các mã sau minh hoạ một di chuyển nội platform: // Create some variables
String containerName = "Container-1";
ContainerID destination = new ContainerID(); // Initialize the destination object
destination.setName(containerName); // Change of the agent state to move myAgent.doMove(destination);
In the case of inter-platform migration, a similar example is as follows:
// Build the AID of the corresponding remote platform’s AMS
AID remoteAMS = new AID("ams@remotePlatform:1099/JADE", AID.ISGUID); // Specify the MTP by setting the transport address of the remote // AMS
remoteAMS.addAddresses("http://remotePlatformaddr:7778/acc"); // Create the Location object
PlatformID destination = new PlatformID(remoteAMS); // Change of the agent state to move
myAgent.doMove(destination);
Để sao chép một agent phương thức doClone () được sử dụng để thay đổi trạng thái agent để COPY. Để sử dụng nó, hai đối số phải được thông qua: đích đến container và tên agent mới. Đây là một ví dụ:
// Create some variables
String containerName = "Container-1"; String newAgentName = "myClone";
ContainerID destination = new ContainerID(); // Initialize the destination object
destination.setName(containerName); // Change of the agent state to clone
myAgent.doClone(destination, newAgentName);
Như các dịch vụ di động cài đặt việc di chuyển yếu, một cấu trúc mã dựa trên một máy hữu hạn trạng thái được yêu cầu. Điều này là do truy cập chương trình của agent thực thi không được truyền, làm cho nó không thể tiếp tục agent thực hiện từ dòng tiếp theo chỉ dẫn của doMove() hoặc doClone (). Thay vào đó, agent thực hiện có thể tiếp tục chỉ từ đầu đoạn mã hành vi của agent. Sử dụng máy hữu hạn trạng thái để biểu diễn, một cấu trúc có thể được tạo ra trong đó đoạn mã agent thành phần với các biến được gán chỉ ra trạng thái mã agent thực thi.
Một tuyên bố chuyển đổi được sử dụng, ví dụ, một agent với cả người bán và người mua có thể có vai trò mã với cả 2 trạng thái, một cho việc bán và một cho việc mua. Các agent phải thiết lập một biến trạng thái trước khi rời một container hoặc một platform để cho biết có vai trò sẽ được khởi tạo cho thông qua trong các vị trí tiếp theo. Để tạo ra có thể sử dụng cách biểu diễn máy hữu hạn trạng thái. Ví dụ, trong một hành trình hai container trong đó container đích là một mảng các địa điểm, các mã hành vi được thực hiện trong mỗi container được phân cách như trong ví dụ sau đây:
addBehaviour(new CyclicBehaviour(this){ public void action() {
switch(_state){ case 0:
// Agent starts to migrate _state++;
myAgent.doMove(_dests[0]); break;
case 1:
// Agent migrates to the second container _state++; myAgent.doMove(_dests[1]); break; case 2: // Agent dies myAgent.doDelete(); break; default: myAgent.doDelete(); } }
private ContainerID[] _dests = ...; private int _state = 0;
});
Ví dụ này cho thấy cách mà mã agent phải được cấu trúc trong Jade để bảo đảm các trạng thái của nó bằng cách sử dụng một biến. Trong suốt các tiến trình di chuyển của mã agent của
serialization và deserialization, một số tài nguyên sử dụng bởi agent cũng sẽ được chuyển giao,
trong khi những agent khác sẽ bị ngắt kết nối trước khi sự di chuyển của agent và kết nối lại tại điểm đích. Jade cung cấp hai phương pháp kết hợp trong các lớp Agent cho việc quản lý nguồn tài nguyên mà chỉ cần được nạp chồng bởi các lập trình viên:
• BeforeMove(): được gọi tại vị trí nguồn khi hoạt động di chuyển hoàn thành thành công
như thể hiện của agent được di chuyển là để được kích hoạt trên container đích và các thể hiện của agent ban đầu là để được chấm dứt. Phương thức này là vị trí chính xác để phát hành bất kỳ nguồn lực địa phương được sử dụng bởi các thể hiện của agent ban đầu (ví dụ như đóng mở các file và ảnh minh hoạ). Nếu các nguồn lực này đã được sử dụng trước khi biết nếu một di chuyển thành công, chúng vừa mới mở lại một lần nữa. Tuy nhiên, do hậu quả của việc này là bất kỳ thông tin được vận chuyển bởi agent đến vị trí mới phải được thiết lập trước khi các phương thức doMove() được gọi. Thiết lập một thuộc tính của
agent trong các phương thức beforeMove() sẽ không có tác động đến thể hiện của sự di chuyển.
• AfterMove(): được gọi tại vị trí đích đến ngay sau khi các agent đến và việc
nhận dạng nó được đặt ra, nhưng trước khi việc lập lịch hành vi khởi động lại.
Đối với agent nhân bản, Jade cung cấp một cặp phương thức tương ứng là phương thức
beforeClone() và afterClone(). Chúng được gọi trong cùng một dạng như phương thức
beforeMove () và phương thức afterMove (). Tất cả bốn phương thức này đều là protect và là các
thành viên của lớp Agent, được định nghĩa như là placeholders rỗng. Người dùng được định nghĩa các agent di động có thể ghi đè lên 4 phương thức khi cần thiết.