JavaScript Evented I/O & more
for the Java Enterprise Ecosystem

 

Niko Köbler (@dasniko)
{JavaScript}Training

Node.js on the JVM

What is Node.js?

  • Server-side JavaScript platform built on Google V8 engine
  • What JavaScript has done for the webbrowser,
    Node.js is doing for the backend server
  • http://nodejs.org

 

  • Asyncronous, non-blocking, evented I/O with JavaScript
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

The Event Loop

The cost of I/O

L1-cache              3 cycles
L2-cache             14 cycles
RAM                 250 cycles
Disk         41 000 000 cycles
Network     240 000 000 cycles

Why JavaScript?

(undefined is not a function!)

Why Java?

With Java, we have...

And now, you wanna tell us
about this "brave" new (Node-)JS-world?

Speaking JavaScript

Like it or not, JavaScript is everywhere these days - from browser to server to mobile - and now you, too, need to learn the language or dive deeper than you have.
Dr. Axel Rauschmayer
In four years ... Node.js has experienced phenomenal growth. Node.js is the language of choice for high performance, low latency applications and has been powering everything from robots to API engines to cloud stacks to mobile web sites.

Any application that can be written in JavaScript, will eventually be written in JavaScript

Integration

Integration

Integration

dynamic

invoke

Nashorn

  • JavaScript Enginge on the JVM
  • based on invokedynamic feature
  • competes with Google V8
  • ECMAScript 5.1 compatible (ES6/ES2015 with Java 9)
  • Seamless interoperability of Java and JavaScript
  • Shell Scripting
  • Language and API Extensions

closures, collections & for each, multi-line string literals, string interpolation, __noSuchProperty__, __noSuchMethod__, typed arrays, binding properties, error extensions, conditional catch clause, String functions, and many, many more...

Java and JavaScript

...are similar than car and carpet are similar.

Nashorn

Command Line Client

$ $JAVA_HOME/bin/jjs
jjs> print('Hello Nashorn!');

Nashorn

Invoking JavaScript from Java

ScriptEngine engine = new ScriptEngineManager()
                              .getEngineByName("nashorn");
engine.eval("print('Hello Nashorn!');");
engine.eval(new FileReader("scriptfile.js"));
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction(
                              "jsSayHello", "Nashorn");

Nashorn

Invoking Java from JavaScript

package my.package;
public class MyJavaClass {
    static String sayHello(String name) {
        return String.format("Hello %s from Java!", name);
    }
}
var MyJavaClass = Java.type('my.package.MyJavaClass');
var result = MyJavaClass.sayHello('Nashorn');
print(result); // Hello Nashorn from Java!

Nashorn

Listing Docker Containers via REST-Call from Shell

#!/usr/bin/jjs -fv
var host = "DOCKER_HOST"
var dockerUri="http://${host}:5555/containers/json";
var command = "curl ${dockerUri}";
$EXEC(command);
var containers = JSON.parse($OUT);
for each(container in containers){
    print("${container.Image} / 
           ${container.Names[0]} / 
           ${container.Status}");
}

(by Adam Bien)

Avatar

The Oracle solution

Avatar 2.0

Avatar 2.0

by project:odd @RedHat

http://nodyn.io

  • http://dynjs.org
  • also based on invokedynamic
  • REPL / command line
  • Java interaction / embedding

Nashorn is on its way!

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

Netty

Node.js Architecture

Nodyn Architecture

more JavaScript than Node.js

Vert.x is a lightweight, high performance application platform for the JVM that's designed for modern mobile, web, and enterprise applications.

  • http://vertx.io
  • Polyglott*
  • Simplicity
  • Scalability
  • Concurrency
  • Distributed Event Bus**

*) Java, JavaScript, Ruby, Groovy, Python, Scala, Clojure, Ceylon

**) using Hazelcast In-Memory Data Grid (hazelcast.org)

vertx2-core

This module exposes the vert.x 2.x eventbus to node.js clients.

https://github.com/nodyn/vertx2-core

mod-nodyn

This supports running Node.js workloads inside of Vert.x.

https://github.com/nodyn/mod-nodyn

Beer-as-a-Service

var http = require("http");
var vertx = require("vertx2-core");

var registration = vertx.eventbus.register("bar", function(message) {
  var amount = message.body.amount;
  console.log("BAR: Someone ordered " + amount + " beer(s).");
  message.reply({wait_time: amount * 1.75});
});

var server = http.createServer(function(request, response) {
  var parts = request.url.split("/");
  var amount = parts[1];

  vertx.eventbus.send("bar", {amount: amount}, function(message) {
    response.write(amount + " beer(s) will be ready in "
        + message.body.wait_time + " minutes");
    response.end();
  });
});

server.listen(9000, function() {
  console.log( "Beer-Server is listening on port 9000" );
});

beer-as-a-service.js

run with nodyn
var http = require("http");
var vertx = require("vertx2-core");

var server = http.createServer(function(request, response) {
  var parts = request.url.split("/");
  var amount = parts[1];

  vertx.eventbus.send("bar", {amount: amount}, function(message) {
    response.write(amount + " beer(s) will be ready in "
        + message.body.wait_time + " minutes");
    response.end();
  });
});

server.listen(9000, function() {
  console.log( "Beer-Server is listening on port 9000" );
});

beer-web.js

beer-bar.js

var eventBus = require("vertx/event_bus");

eventBus.registerHandler("bar", function(message, replier) {
  java.lang.System.err.println("BAR: Someone ordered " + message.amount + " beer(s)");
  replier({wait_time: message.amount * 1.75});
});

java.lang.System.err.println("The BAR is open!");
run with vertx in cluster mode

Conclusion

  • JavaScript is an emerging language and widely adopted
  • Node.js / IO.js is very popular
  • Operations, monitoring and integration lacks
  • JVM is Enterprise environment of choice
    (and all the above lacks are already solved)
  • Run JavaScript on the JVM thanks to invokedynamic
    (Nashorn, DynJS)
  • Re-use your infrastructures and libraries with Node
  • Nodyn from Red Hat
    • Re-use of Node API module, integration of Netty and Vert.x
    • Process-bindings in Java/JavaScript
    • Embed Node.js apps into your Java applications
    • Run Node.js apps in distributed environments

Avatar & Nodyn
@ JavaMagazin

Thank you!

Questions?

Node.js on the JVM

By Niko Köbler

Node.js on the JVM

JavaScript Evented I/O & more for the Java Enterprise Ecosystem with Node.js alternatives on the JVM - Avatar and Nodyn

  • 6,686