Управление запросами
Для запрос к другому актору, нужно объявить класс-поведение, и задать методы с возможной сигнатурой ответа. При вызове метода request, возвращается объект Future, в котором черем метод handle, нужно указать имя поведения, для обработки ответа.
Внимание: если не указать поведение, то запрсов не выполниться.
При ответе, актор может получить сообщения типа reply или complaint, в классе-поведения обрабатывающий запрос, нужно покрыть возможные варианты сигнатуры сообщения.
Пример:
Есть актор Account, в котором присутсвует медот-обработчик login. При обработке сообщения, если данные логина и пароля, соответсвует данным аккаунта, то Account отправляет объект LoginSuccess, если не правильные данные, то отвечает через метод complaint, отправляет LoginFail.WrongLoginOrPassword.
Сообщение от
Спойлер
Код:
Код:
package fact.samples;
import fact.Context;
public class AccountRequest implements Context {
private String login;
private String password;
public AccountRequest(String login, String password) {
this.login = login;
this.password = password;
}
public void login(String login, String password) {
if(this.login.equals(login) && this.password.equals(password)) {
reply(success);
} else
complaint(LoginFail.WrongLoginOrPassword);
}
public static class LoginSuccess {
private LoginSuccess() { }
}
private final static LoginSuccess success = new LoginSuccess();
public enum LoginFail {
WrongLoginOrPassword,
AccountInUse
}
}
В акторе который производит запрос, присутсвует класс поведения Request, в котором определенны два обработчика, на успешный запрос и провальный запрос. Для простоты, создаем актор-аккаунт, на месте.
В примере показывается, что вовремя запроса, актор будет обрабатывать, только ответ. Другие сообщения обрабатываются после запроса, то есть актор блогируется для обработки входящих сообщения, за исключение ответа на запрос.
Сообщение от
Спойлер
Код:
Код:
public class RequestSample implements Context {
Reference account;
public void define() {
account = create("account", new AccountRequest("root", "root"));
account.request("login", "login", "login").handle("Request");
send("tick");
send("print");
}
public void tick() {
account.request("login", "root", "root").handle("Request");
send("print");
}
public void print() {
System.out.println("print");
}
public class Request {
public void reply(LoginFail fail) {
System.out.println("login failed");
}
public void reply(LoginSuccess success) {
System.out.println("login success");
}
}
public static void main(String...args) {
Model.launch(new RequestSample());
}
}
История вычислений данного примера:
[QUOTE="Спойлер"]
[COLOR="#363940"]
0 E AccountRequest