{
"name":"Fran García",
"email":"fgarciarico@gmail.com",
"twitter":"@frangarcia",
"linkedin":"https://www.linkedin.com/in/frangarcia/",
"position":"Ingeniero de Software Senior en Wayin",
"description":"Desde 2014 con Vert.x"
}
Fuente: https://www.ericsson.com
Aprovechemos mejor los recursos.
Se refiere a un paradigma de programación enfocado al tratamiento de flujos de datos de forma asíncrona tal y como se recoge en el Reactive Manifesto http://www.reactivemanifesto.org
Fuente: http://www.reactivemanifesto.org
Eclipse Vert.x (http://vertx.io) es un conjunto de utilidades (no un framework) basado en 2 conceptos
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install vertx
Fuente: http://www.vertx.io
Node.js utiliza un único event loop mientras que Vert.x utiliza un event loop por cada core multiplicado por dos. Esto se conoce como Multi-Reactor Pattern.
!!No bloquees el event loop!!
vertx.executeBlocking({ future ->
// Llama a métodos bloqueantes
def result = someAPI.blockingMethod("hello")
future.complete(result)
}, { res ->
println("The result is: ${res.result()}")
})
vertx run s01e01.groovy
import io.vertx.core.http.HttpServer
HttpServer httpServer = vertx.createHttpServer()
//Responder a cada petición con un Hello World!
httpServer.requestHandler({ request ->
// Este handler será llamado con una petición al servidor
request.response().end("hello world!")
})
httpServer.listen(8080)
vertx run s01e02.groovy
import io.vertx.core.http.HttpServer
HttpServer httpServer = vertx.createHttpServer()
//Responder a cada petición con un Hello World!
httpServer.requestHandler({ request ->
String json = """{"foo":"bar"}"""
request.response()
.putHeader("Content-Type", "application/json")
.putHeader("Content-Length",json.size().toString())
.write(json)
.end()
})
httpServer.listen(8080)
vertx run s01e03.groovy
vertx.setPeriodic(1000, {id ->
println("Temporizador ejecutado! ${id}")
})
vertx run s01e04.groovy
Closure handler
handler = { id ->
println("Temporizador ejecutado! ${id}")
vertx.setTimer(1000*(id+1), handler)
}
vertx.setTimer(1000, handler)
vertx.deployVerticle("HelloWorldHttpVerticle.groovy")
vertx.deployVerticle("s01e06.groovy")
import io.vertx.core.AbstractVerticle
public class HelloWorldHttpVerticle extends AbstractVerticle {
public void start() {
println("Starting HelloWorldHttpVerticle")
}
public void stop() {
println("Stopping HelloWorldHttpVerticle")
}
}
void vertxStart() {
println "starting s01e06"
}
void vertxStop() {
println "stopping s01e06"
}
vertx run s01e07.groovy
import io.vertx.core.Future
void vertxStart(Future future) {
vertx.deployVerticle("s01e06.groovy", { res ->
if (res.succeeded()) {
println "s01e06 started successfully asynchronously"
future.complete()
} else {
println "error starting s01e06 asynchronously"
future.fail("Error starting s01e06")
}
})
}
void vertxStop(Future future) {
println "stopping s01e06"
future.complete()
}
vertx run HelloWorldHttpVerticleAsync.groovy
import io.vertx.core.AbstractVerticle
import io.vertx.core.Future
public class HelloWorldHttpVerticleAsync extends AbstractVerticle {
public void start(Future future) {
println "starting"
vertx.deployVerticle("s01e06.groovy", { res ->
if (res.succeeded()) {
println "s01e06 started successfully asynchronously"
future.complete()
} else {
println "s01e06 not started asynchronously due to an error"
future.fail()
}
})
}
public void stop(Future future) {
println("stopping")
future.complete()
}
}
vertx run s01e08.groovy
vertx.deployVerticle("HelloWorldHttpVerticle.groovy", [instances:5])
def options = [
worker:true
]
vertx.deployVerticle("MyFirstVerticle", options)
Todos los handlers suscritos a una dirección recibirán el mensaje.
Vert.x se encargará de que sólo un handler reciba el mensaje. Se puede especificar incluso un reply handler.
Normalmente se utiliza Json, aunque no estamos forzados a ello.
def eb = vertx.eventBus()
eb.consumer("news.uk.sport", { message ->
println("I have received a message: ${message.body()}")
})
vertx run PublishingMessage.groovy
import io.vertx.core.http.HttpServer
def eventBus = vertx.eventBus()
eventBus.consumer("news.uk.sport", { message ->
println("EH1: I have received a message: ${message.body()}")
})
eventBus.consumer("news.uk.sport", { message ->
println("EH2: I have received a message: ${message.body()}")
})
HttpServer httpServer = vertx.createHttpServer()
httpServer.requestHandler({ request ->
eventBus.publish("news.uk.sport", "Yay! Someone kicked a ball")
request.response().end("event sent")
})
httpServer.listen(8080)
vertx run PointToPointExample.groovy
import io.vertx.core.http.HttpServer
def eventBus = vertx.eventBus()
eventBus.consumer("news.uk.sport", { message ->
println("EH1: I have received a message: ${message.body()}")
})
eventBus.consumer("news.uk.sport", { message ->
println("EH2: I have received a message: ${message.body()}")
})
HttpServer httpServer = vertx.createHttpServer()
httpServer.requestHandler({ request ->
eventBus.send("news.uk.sport", "Yay! Someone kicked a ball")
request.response().end("event sent to one consumer")
})
httpServer.listen(8080)
vertx run EventReplyExample.groovy
import io.vertx.core.http.HttpServer
def eventBus = vertx.eventBus()
eventBus.consumer("news.uk.sport", { message ->
println("I have received a message: ${message.body()}")
message.reply("Event received, thanks!")
})
HttpServer httpServer = vertx.createHttpServer()
httpServer.requestHandler({ request ->
eventBus.send("news.uk.sport", "Yay! Someone kicked a ball", { ar ->
if (ar.succeeded()) {
request.response().end("This is what we received: \"${ar.result().body()}\"")
} else {
request.response().end("There was an error")
}
})
})
httpServer.listen(8080)
Si sólo conocieramos Eclipse Vert.x, ¿como diseñaríamos la arquitectura de un servicio para registrar usuarios que necesita mandar un mail de confirmación a través de un servicio externo y al mismo tiempo el nuevo usuario debe ser añadido a otro servicio externo?