Как каждое соединение обрабатывается в play framework 2?

Я получаю смешанную информацию о том, как устроена игра 2. На сайте написано, что он построен на акке, что, скорее всего, означает, что он использует актера для каждого соединения? В нем также говорится не писать блокирующий код, потому что он предотвращает запуск других событий в разных соединениях (вроде того, как он блокирует цикл событий в node.js). Как это может быть, если код блокировки в одном акторе не блокирует код в другом акторе? Разве не в этом смысл использования актеров вместо обратных вызовов, таких как node.js?


person james123    schedule 04.03.2013    source источник


Ответы (1)


Когда они говорят, что Play построен поверх Akka, они имеют в виду фреймворк, а не веб-сервер. Соединения обрабатываются JBoss Netty (http://netty.io/), который является встроенным веб-сервером.

Соединения могут быть привязаны (или нет) к актеру Akka для предоставления асинхронного ответа, как описано здесь: http://www.playframework.com/documentation/2.1.0/JavaAkka

Связь между акторами не блокируется, потому что они отправляют сообщения (любой объект) и не ждут ответа (они не вызывают методы для связи с другим актором).

Логика похожа на эту:

//somewhere in the code
ActorB.tell(new Request(...));
-----------------------------------------
ActorB:

    public void onReceive(Object msg) throws Exception {
        if (msg instanceof Request) {
            //process the request
            ActorA.tell(new Response(...))
        }
    }
----------------------------------------------------------------
ActorA:

    //ActorA is notified
    public void onReceive(Object msg) throws Exception {
        if (msg instanceof Response) {
            System.out.println("Response: " + msg)
        }
    }

Метод tell() отправляет сообщение и не ждет ответа.

person TizianoPiccardi    schedule 05.03.2013