Marcel
Marcel

Reputation: 497

Vertx Java deploy a JavaScript verticle with Future Callback

i would like deploy inside my Java VertX a javascript Verticle. Of course, this is not a problem. The question is, how can i give them a callback ?

My Java Code:

    Vertx.clusteredVertx(vertxOptions, res ->
    {
        if (res.succeeded()) {
            logger.info("Cluster ready, starting verticle deploy");
            /*
             * React JS Server Deploy
             */
            Future< String > reactVerticleFuture = Future.future();

            vertx.executeBlocking(future ->
            {
                vertx.deployVerticle("dist/server.js", options, deployResult ->
                {
                    if (deployResult.succeeded()) {
                        future.complete();
                    } else {
                        future.fail(deployResult.cause());
                    }
                });

            } , reactVerticleFuture.completer());

             CompositeFuture.all(..., reactVerticleFuture).setHandler(ar ->
            {
               /*
                * deploy http listener and health endpoint
                */
            });
        } else {
            logger.error(res.cause().getMessage(), res.cause());
        }
    });

My server.js:

exports.vertxStartAsync = function(startFuture) {

console.log('vertxStartAsync')

var eb = vertx.eventBus()
var consumer = eb.consumer('httpGetWebChannel', function (message) {
})

consumer.completionHandler(function (res, res_err) {
    if (res_err == null) {
        console.log("The handler registration has reached all nodes");

        startFuture.complete()
    } else {
        console.log("Registration failed!");

        startFuture.fail()
    }
});
}

Of course, my server.js is bigger and this need's some time for starting. In my clustered Vertx i get during the start some messages that something blocks my bus.

How can i fix this ?

Thanks Marcel

Upvotes: 0

Views: 890

Answers (1)

Marcel
Marcel

Reputation: 497

Ok, we found a solution ( alexvetter - thanks for your patience).

The problem is that i build my server.js file with webpack and after building, the exports block is inside a function.

This is the working solution:

webpack.config.js

var WrapperPlugin = require('wrapper-webpack-plugin');

... 

plugins: [
        new WrapperPlugin({
            header: 'exports.vertxStartAsync = function(startFuture) {\n',
            footer: '}\n'
        }),
...
]
...

server.js

var eb = vertx.eventBus()
var consumer = eb.consumer('httpGetWebChannel', function (message) {
  ...
})

consumer.completionHandler(function (res, res_err) {
    if (res_err == null) {
        console.log("The handler registration has reached all nodes");

        startFuture.complete()
    } else {
        console.log("Registration failed!");

        startFuture.fail()
    }
});

Thanks

Upvotes: 1

Related Questions