Статьи

Веселье со Scala и Vert.x

Vert.x — это основанная на событиях среда приложения, основанная на событиях полиглота, которая работает на виртуальной машине Java (минимальная поддерживаемая версия JAVA 7). Как и Node.js, Vert.x является асинхронным и масштабируемым и позволяет разработчикам создавать современные и эффективные веб-приложения.

Будучи полиглотом, Vert.x может использоваться во многих вариантах, среди которых: JavaScript, CoffeeScript, Ruby, Python, Groovy и Java. Чтобы обеспечить асинхронность и масштабируемость, Vert.x построен на Netty, используя схему реактора, используя пугающее количество обработчиков.

Целью данной статьи является демонстрация мощного сочетания Scala и Vert.x — аналога Java, предоставляемого для сравнения.

Примечание: исходный код размещается на GitHub как часть lang-scala https://github.com/ouertani/vert.x/tree/master/vertx-lang/vertx-lang-scala

Vert.x поддерживает множество компонентов:

  WebSocket
  HttpServer
  Распределенная шина событий
  TCP-сервер, SockJS, … здесь не представлен.

I — WebSocket

Web Socket — это функция HTML 5, обеспечивающая полнодуплексную связь. Для старых браузеров, которые не поддерживают WebSocket, Vert.x предоставляет SockJS как готовый компонент.

Для запуска следующего примера проверьте: https://github.com/ouertani/vert.x/blob/master/vertx-examples/src/main/javascript/websockets/ws.html и сохраните его в скомпилированном lib
версия каталога Java

import org.vertx.java.core.Handler;
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.core.http.ServerWebSocket;
import org.vertx.java.deploy.Verticle;
 
public class SampleWebSocket extends Verticle {
 
  public void start() {
    vertx.createHttpServer().websocketHandler(new Handler<ServerWebSocket>() {
      public void handle(final ServerWebSocket ws) {
        if (ws.path.equals("/myapp")) {
          ws.dataHandler(new Handler<Buffer>() {
            public void handle(Buffer data) {
              ws.writeTextFrame(data.toString()); // Echo it back
            }
          });
        } else {
          ws.reject();
        }
      }
    }).requestHandler(new Handler<HttpServerRequest>() {
      public void handle(HttpServerRequest req) {
        if (req.path.equals("/")) req.response.sendFile("ws.html"); // Serve the html
      }
    }).listen(8080);
  }
}
scala version

import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.core.http.ServerWebSocket;
import org.vertx.scala.deploy.Verticle
import org.vertx.scala.core._
 
class SampleWebSocket extends Verticle (
  _.getVertx().createHttpServer().websocketHandler{
  ws:ServerWebSocket => ws.path match {
  case "/myapp" => ws.dataHandler{data : Buffer =>  ws.writeTextFrame(data.toString())}
  case _ => ws.reject();
  }}
  .requestHandler{req : HttpServerRequest => req.path match {case ("/") => req.response.sendFile("ws.html")}}
  .listen(8080)
)()

II-HttpWebServer

Vert.x позволяет легко писать полнофункциональные, высокопроизводительные и масштабируемые серверы HTTP и HTTPS.

В следующем примере запускается Http-сервер, прослушивающий порт 8080 и регистрирующий все полученные запросы.
Джава

import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpServer;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.core.logging.Logger;
import org.vertx.java.deploy.Verticle;
 
 
public class SampleHttpWebServer extends Verticle {
 
  public void start() {
  HttpServer server = vertx.createHttpServer();
  final Logger log = getContainer().getLogger();
  server.requestHandler(new Handler<HttpServerRequest>() {
  public void handle(HttpServerRequest request) {
  log.info("A request has arrived on the server!");
  }
  }).listen(8080, "localhost");
  }
}

Scala

import org.vertx.java.core.http. { HttpServerRequest => JHttpServerRequest}
import org.vertx.scala.deploy.Verticle
import org.vertx.scala.core._
 
class SampleWebServer extends Verticle ( x =>
  x.getVertx().createHttpServer().withRequestHandler{_ : JHttpServerRequest =>
  x.info("A request has arrived on the server!")}
.listen(8080, "localhost")
)()

III-HttpClient

Vert.x также предоставляет HttpClient API для взаимодействия с серверной частью. В следующих примерах создается и отправляется запрос GET, затем регистрируется ответ сервера.
Джава

import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpClient;
import org.vertx.java.core.http.HttpClientRequest;
import org.vertx.java.core.http.HttpClientResponse;
import org.vertx.java.core.logging.Logger;
import org.vertx.java.deploy.Verticle;
 
 
public class SampleHttpClient extends Verticle {
 
  @Override
  public void start() throws Exception {
  HttpClient client = vertx.createHttpClient().setHost("127.0.0.1");
  final Logger log = getContainer().getLogger();
 
  HttpClientRequest request = client.post("/some-path/", new Handler<HttpClientResponse>() {
  public void handle(HttpClientResponse resp) {
  log.info("Got a response: ");
  }
  });
 
  request.end();
  }
}

Scala

import org.vertx.scala.deploy.Verticle
import org.vertx.scala.core._
 
class SampleWebClient extends Verticle (v =>
  v.getVertx.createHttpClient().setHost("127.0.0.1").setPort(8080)
  .andGetNow("/") {_ => v.info("Got a response: " )}
  )()

IV-EventBus Шина

событий похожа на позвоночник, ее можно использовать для соединения распределенных узлов и для поддержки взаимодействия между различными вертикалами, даже написанными на разных языках.
Джава

import org.vertx.java.deploy.Verticle;
import org.vertx.java.core.eventbus.EventBus;
 
public class SampleEventBus extends Verticle {
  @Override
  public void start() throws Exception {
  EventBus eb = vertx.eventBus();
  eb.send("path", "ping1");
  eb.send("path", "ping2");
  }  
}

Scala

import org.vertx.scala.deploy.Verticle
import org.vertx.scala.core._
class SampleEventBus extends Verticle ( x => {
 val  point = x ! ("path")
 point >> ("ping 1")
 point >> ("ping 2")
}
)()

Заключение В

этой статье были представлены основные принципы работы с Vert.x с использованием языка scala и короткие примеры. Надеюсь, скоро появится полная языковая поддержка Scala.

Оставайтесь с нами, в следующем посте вы узнаете больше о Vert.x со Scala.
источник: http://blog.zenika.com/index.php?post/2013/02/11/fun-with-scala-and-vert-x