Тема: актор 0.*
Показать сообщение отдельно

  #4  
Старый 01.02.2017, 21:33
gattsu
Участник форума
Регистрация: 24.11.2015
Сообщений: 165
С нами: 5509192

Репутация: 1457
По умолчанию

Управление запросами

Для запрос к другому актору, нужно объявить класс-поведение, и задать методы с возможной сигнатурой ответа. При вызове метода 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
 
Ответить с цитированием