如何响应来自eventbus消费者的http请求

时间:2016-09-19 03:13:49

标签: java vert.x

更改: 如何从socket响应http请求。 网络代码:

public void start() {
    Router router = Router.router(vertx);
    router.route("/api/getdata").handler(this::getData);
    vertx.createHttpServer().requestHandler(router::accept).listen(8080);
}

private void getData(RoutingContext routingContext) {
    vertx.eventBus().send(ServerVerticle.ADDRESS, pricemessage, reply -> {

    });
}

套接字代码:

public void start() {
    final EventBus eb = vertx.eventBus();
    NetClient netClient = vertx.createNetClient();
    if (ar.succeeded()) {
        socket.handler(this::onDataReceived);
        eb.consumer(ServerVerticle.ADDRESS, message -> {
            socket.write(buffer);   // request from the getData method
            message.reply(data);// no data here, it's in the handler
        }
    }
}

private void onDataReceived(Buffer buffer) {
    // buffer changed to JsonObject here
    vertx.eventBus().send("some address here", jsonObject);
}

套接字处理程序没有返回值。只是一个eventbus发送。 而且我不知道如何将这个jsonObject响应给http请求。

=============================================== =========================

老问题,也许不清楚。 我有一个处理套接字写入和响应的顶点。

public void start() {   // 1
    NetClient netClient = vertx.createNetClient();
    netClient.connect(port, host, ar -> {
        socket = ar.result(); // NetSocket
        socket.handler(this::doSocketHandleMethod);
        socket.write(BYTEBUFFER);// buffer here
    })
}

private void doSocketHandleMethod(Buffer buffer){ // socket handler 
    // process data here and send
    vertx.eventBus().send(ADDRESS, data here);
}

我使用以下代码从http请求中获取响应。

public void start() {
    Router router = Router.router(vertx);
    router.route(API_GET).handler(this::getData);

    vertx.eventBus().consumer(ADDRESSHERE, msg -> {
        // get data from the socket send.    2
    });
         vertx.createHttpServer().requestHandler(router::accept).listen(8080, result -> {

        });
}

private void getData(RoutingContext routingContext) {
    vertx.eventBus().send(ADDRESS, message); // send message to the top // 1 verticle

// 3 
}

问题是上面提到的第二个代码获取数据,但不确定如何从http reqest 3获取响应。

1 个答案:

答案 0 :(得分:1)

HttpServerRequest )传递给路由(requestHandler(router::accept))并包含在 RoutingContext 中。 “当服务器收到HTTP请求时,将创建[...] HttpServerRequest的实例并将其传递给此处理程序。” - JavaDoc

因此,如果数据到达2并且您想要对 HttpServerRequest 做出响应(作为第三步),则可以在routingContext.response()中使用getData()方法,获取 HttpServerResponse

如果你想处理一个http服务器请求,通过向正在从套接字获取一些数据并希望将此结果作为对特定http服务器请求的回复发送的消费者发送消息,那么你可以做类似的事情。这样:

// Send a message and get the response via handler
private void getData(RoutingContext routingContext) {
vertx.eventBus().send(ADDRESS, message, handler -> {
  if(handler.succeded()) {
    routingContext.response().end(handler.result());
  }
  else {
    // error
  }
});
}

// To reply to a message do
vertx.eventBus().consumer(ADDRESSHERE, msg -> {
    // get data from the socket send.    2
  msg.reply(data); // you can only do a reply once. Put data into reply
});

据我所知,事件总线只知道“发送和回复”而不是像套接字这样的概念。看起来你想在每次通过套接字获得新数据时发送数据。

您可以在httpResponse多次写入内容,因此您需要保存对响应对象的引用

但我不知道,如果这是一个好主意。我建议封装socket-get-data进程。 “套接字”垂直只回答一次,它得到了整个缓冲区。以下是我的意思的两个例子。

// open socket
vertx.eventBus().consumer("ADRRESS", message -> {
  // execute this on worker thread to not block the event bus thread
  vertx.executeBlocking(future -> {
    Buffer buffer = Buffer.buffer();
    socket.handler(buff -> buffer.appendBuffer(buff)) // read data
    .endHandler(endHandler -> {
      // no more data to read
      socket.pause();
      future.complete(buffer);
    })
    .resume() // socket was paused, now read the data
    .exceptionHandler(err -> future.fail(err)); // handle exception
  }, result -> {
    if(result.succeeded()) {
      message.reply(result.result()); // reply with the buffer content
    }
    else {
      message.reply(result.cause()); // may want to send error later
    }
  });
});

// connect and get a new socket every time
vertx.eventBus().consumer("ADRRESS", message -> {
  // execute this on worker thread to not block the event bus thread
  vertx.executeBlocking(future -> {
    netClient.connect(1, "", netSocketHandler -> {
      if(netSocketHandler.succeeded()) {
        Buffer buffer = Buffer.buffer();
        netSocketHandler.result().handler(buff -> buffer.appendBuffer(buff)) // read data
        .endHandler(endHandler -> {
          // no more data to read
          future.complete(buffer);
          netSocketHandler.result().close(); // close the NetSocket once finished
        })
        .exceptionHandler(err -> {
          netSocketHandler.result().close();
          future.fail(err);
        }); // handle exceptions
      }
      else {
        future.fail(netSocketHandler.cause());
      }
    });
  }, result -> {
    if(result.succeeded()) {
      message.reply(result.result()); // reply with the buffer content
    }
    else {
      message.reply(result.cause()); // may want to send error later
    }
  });
});

如果这个真的没有帮助你,我很抱歉,也许这不是你想要的概念。