![]() |
Нашел более менее оптимальный вариант, проектирование систем на основе акторов, в java.
Для простоты и прозрачности, логики, все поведение програмируется внутренними классами. Реализовал базовый набор по Hewitt-у, во время обработки сообщения, актор может: - отправлять сообщения другим акторам и самому себе(рекурсивное сообщение) (метод Context.send и Reference.send) - менять свое поведения (метод Context.become) - создавать других акторов (метод Context.create) О поведении актора, на основе просто примере будет более наглядно: Цитата:
Если расширить данный пример, можно реализовать актор для сервера авторизации. Замечание: если пришло сообщение, которого нету в заданном поведение, то метод для обработки сообщения ищеться в базов классе. В данном примере, если отправить сообщение logout, когда актор установлен как Free, будет вызван обработчик из базового класса Account, на экран консоли, выведиться сообщение "wrong logout" Пример использования: Цитата:
|
- Добавил отправку сообщений с задержкой
Цитата:
- print с задержкой 1сек - tick без задержок оба сообщения рекурсивны. На каждое сообщения tick, увеличивается счетчик, на каждое сообщения print отображается показатель счетчика и затем сбрасывается на ноль. Заложил сетевой фреймворм, на основеjava.nio. Для простого примера реализавал, ехо сервер. |
Обновил. "немного" переделал код. Интерфейс остался обратно совместимый. Исключение запросы.
- добавил полный цикл обслуживания актора create/stop/resume/terminate(kill). При остановке, возврате или удаленния актора, можно устанавливать,обратный вызов, функция которая будет вызвана, в случае успешной операции. Примечани: Функции обратного вызова должны быть определенны в классе актора. |
Управление запросами
Для запрос к другому актору, нужно объявить класс-поведение, и задать методы с возможной сигнатурой ответа. При вызове метода request, возвращается объект Future, в котором черем метод handle, нужно указать имя поведения, для обработки ответа. Внимание: если не указать поведение, то запрсов не выполниться. При ответе, актор может получить сообщения типа reply или complaint, в классе-поведения обрабатывающий запрос, нужно покрыть возможные варианты сигнатуры сообщения. Пример: Есть актор Account, в котором присутсвует медот-обработчик login. При обработке сообщения, если данные логина и пароля, соответсвует данным аккаунта, то Account отправляет объект LoginSuccess, если не правильные данные, то отвечает через метод complaint, отправляет LoginFail.WrongLoginOrPassword. Цитата:
В примере показывается, что вовремя запроса, актор будет обрабатывать, только ответ. Другие сообщения обрабатываются после запроса, то есть актор блогируется для обработки входящих сообщения, за исключение ответа на запрос. Цитата:
[QUOTE="Спойлер"] [COLOR="#363940"] 0 E AccountRequest |
- Переделал сетвой API. Реализовал пример эхо сервера.( Соединение отправляет каждые 100 мс строку, сервер читает её отображает на консоль и отправляет обратно, клиент читае и отображает на консоль)
- Переместил сетевой API в репозиторий ядра. - Добавил методы для определения типа сообщения(запрос, ответ, ответ-ошибка) |
Обновил:
- реализовал цепочку запросов - реализовал передачу запрос(continuation) - реализовал управляющие методы статическим путем, объявленны в fact.ActorContext. Теперь можно получить доступ к управляющим метода чере import static Добавил соответствующие примеры |
Исправиль некоторые ошибки.
Немного lineage. Написал каркас для сервера авторизации.(interlude) Нужно организовать - работу с базой данных - работу с игровыми серверами. Написать, proxy для игрового сервера. - переписать сетевую библиотеку, организовать чтение по требованию. ПС: Для меня не понятно, каким образом работает реализация, криптографии, добавление контрольной суммы и шифровка первого пакет xor ключем. Отсутвует смешение, для задания предела, самое интересное, если подать буффер в котором, уже записанно, минимум 4 байта, то криптография накроется медным тазом. У меня закрались дикие сомнения, что реализация на l2j, если её топорным путем перенести на С не будет работать, так как в jvm зануляет все значения в созданных массивах. Понятно, что в сервере авторизаии, может быть только один пакен на запись и один на чтение, по протоколу, но это всеравно не делает менее ужасней эту криптографию. Не могу понять почему выдает ошибку контрольной суммы, переодически... магия... ПС Двойная авторизация, в l2j вообще кабздец, как так можно было сделать. Ошибка, котороя тянется на все сборки |
[OFF]Тема одного актёра?[/OFF]
|
[OFF]
Цитата:
|
Цитата:
|
| Время: 18:31 |