前面讲过Cloudopt Next是基于Vertx的,而Vertx是一个类似NodeJs的框架,通过事件循环完成对网络请求的处理。所以Vertx不建议阻塞线程,例如数据库操作太慢等情况,尽可能通过异步进行操作。如果不可能避免的需要阻塞,请使用Worker。

    1. Worker.worker<Any>(Handler<Future<Any>>{ f ->
    2. renderText("success!")
    3. }, Handler<AsyncResult<Any>>{ result ->
    4. })
    1. Worker.INSTANCE.worker(f -> {
    2. renderText("success!");
    3. }, result -> {
    4. });

    您可以将会阻塞的代码放入worker中运行,如果您在Resource类下将render系列的方法一并放入,Worker将自动将这个请求从单线程变成并发。

    有时候很难避免bloing的情况下,您可以在路由的方法上增加@Blocking注解,使其自动变为普通的路由。

    1. @Blocking
    2. @GET("blocking")
    3. fun blocking() {
    4. renderText("This is Blocking!")
    5. }
    1. @Blocking
    2. @GET("blocking")
    3. public void blocking() {
    4. renderText("This is Blocking!")
    5. }