Статьи

Использование нового стека Java Web Dev: Play 2.0, Akka, Comet

 

Для людей, которые спешат, вот код и некоторые шаги для запуска нескольких демонстрационных примеров .

Отказ от ответственности: я все еще изучаю Play 2.0, пожалуйста, укажите мне, если что-то не так.

Play 2.0  — это стек веб-приложений, который поставляется вместе с Netty для HTTP ServerAkka для слабосвязанной обработки бэкэнда и Comet / Websocket для асинхронного рендеринга в браузере. Сама Play 2.0 не выполняет никакого управления состоянием сеанса, но использует куки для управления сеансами пользователя и данными Flash . Play 2.0 поддерживает Reactive Model, основанную на Iteratee IO . Также смотрите мой блог о том, как Play 2.0 противостоит Spring MVC .

В этом блоге я расскажу о некоторых из этих моментов, а также о том, как Akka и Comet дополняют Play 2.0. Чем больше я понимаю стек Play 2.0, тем больше понимаю, что Scala лучше подходит для использования преимуществ возможностей Play 2.0 по сравнению с Java. Есть блог о том, как веб-разработчики смотрят на Play 2.0 . Вы можете понять, как актер Akka противостоит JMS, ссылаясь на эту запись Stackoverflow . Хорошая документация об актере Акки здесь .

Play 2.0, Netty, Akka, Commet: как это подходит

Play 2.0, Нетти, Акка, Комета: как это подходит

Play 2.0, Нетти, Акка, Комета: как это подходит

Контейнер сервлетов, такой как Tomcat, блокирует каждый запрос до завершения серверной обработки. Стек Play 2.0 поможет в достижении такого варианта использования, как, например, необходимость обхода в Интернете и получения всего списка продуктов из различных источников неблокирующим и асинхронным способом с использованием слабосвязанной архитектуры, ориентированной на сообщения.

Например, приведенный ниже код не будет масштабируемым в стеке Play 2.0, поскольку Play имеет только 1 основной поток и код блокирует другие запросы, которые должны быть обработаны. В Play 2.0 / Netty приложение регистрируется с помощью обратного вызова в длительном процессе с использованием сред, таких как Akka, когда он завершен, в реактивном режиме.

public static Result index() {
//Here is where you can put your long running blocking code like getting
// the product feed from various sources
return ok("Hello world");
}

Код контроллера для использования Akka для неблокирующей работы с асинхронным обратным вызовом, как показано ниже,

public static Result index() {
return async(
future(new Callable<Integer>() {
public Integer call() {
//Here is where you can put your long running blocking code like getting
//the product feed from various sources

return 4;
}
}).map(new Function<Integer,Result>() {
public Result apply(Integer i) {

ObjectNode result = Json.newObject();

result.put("id", i);
return ok(result);
}
})
);
}

И более чистым и предпочтительным способом является модель актера Акки, как показано ниже,

public static Result sayHello(String data) {

Logger.debug("Got the request: {}" + data);

ActorSystem system = ActorSystem.create("MySystem");
ActorRef myActor = system.actorOf(new Props(MyUntypedActor.class), "myactor");

return async(
Akka.asPromise(ask(myActor, data, 1000)).map(
new Function<Object,Result>() {
public Result apply(Object response) {
ObjectNode result = Json.newObject();

result.put("message", response.toString());
return ok(result);
}
}
)
);
}

static public class MyUntypedActor extends UntypedActor {

public void onReceive(Object message) throws Exception {
if (message instanceof String){
Logger.debug("Received String message: {}" + message);

//Here is where you can put your long running blocking code like getting
//the product feed from various sources

getSender().tell("Hello world");
}
else {
unhandled(message);
}
}
}

Если вы хотите понять, как мы можем использовать Comet для асинхронной визуализации данных в браузере, используя Play, Akka и Comet ссылаются на код в Github . Вот хорошая запись, сравнивающая Comet и Websocket в Stackoverflow .