简体   繁体   English

Vertx单元测试阻塞主线程

[英]Vertx unit-test blocking the main thread

While trying to test a Vert.x verticle using the event bus through a test class, I'm getting an "blocking errors". 在尝试使用事件总线通过测试类测试Vert.x Verticle时,我遇到了“阻塞错误”。 Here down the verticle and test classes: 这里是垂直和测试类:

EventBusReceiverVerticle : EventBusReceiverVerticle

public class EventBusReceiverVerticle extends AbstractVerticle {

    public EventBusReceiverVerticle(String name) {
        this.name = name;
    }

    public void start() {

              vertx.eventBus().consumer("geo-service", (Message<JsonObject> handler) -> {
            {
                try {
                    System.out.println("sleep 10 seconds");
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }           
            }
        });
    }
}

The test class: 测试类:

@RunWith(VertxUnitRunner.class)
public class MyFirstVerticleTest {
    Vertx vertx;
    EventBus eb;
    private static final Logger logger = LoggerFactory.getLogger(MyFirstVerticleTest.class);


    @Before
    public void setUp(TestContext context) {
        logger.info("@Before");
        vertx = Vertx.vertx();
        eb = vertx.eventBus();

        Async async = context.async();
        vertx.deployVerticle(new EventBusReceiverVerticle("R1"), res -> {
            if (res.succeeded()) {
                async.complete();
            } else {
                context.fail();
            }
        });
    }

    @After
    public void tearDown(TestContext context) {
        logger.info("@After");
        Async async = context.async();
        vertx.close(event -> async.complete());
    }


    @Test
    public void testEventBusVerticle(TestContext context) {
        Async async = context.async();
        JsonObject msg = new JsonObject("{\"action\":\"pos\"}");
        eb.send("geo-service", msg, reply -> {
            if (reply.succeeded()) {
                async.complete();
            } else {
                context.fail();
            }
        });
        async.complete();
    }
}

Console output: 控制台输出:

Sep 05, 2015 2:20:23 PM com.company.MyFirstVerticleTest
INFO: @Before
sleep 10 seconds
Sep 05, 2015 2:20:24 PM com.company.MyFirstVerticleTest
INFO: @After
Sep 05, 2015 2:20:27 PM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 2790 ms, time limit is 2000
Sep 05, 2015 2:20:28 PM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 3794 ms, time limit is 2000
Sep 05, 2015 2:20:29 PM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 4796 ms, time limit is 2000
Sep 05, 2015 2:20:30 PM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 5799 ms, time limit is 2000
io.vertx.core.VertxException: Thread blocked
    at java.lang.Thread.sleep(Native Method)
    at com.company.verticals.EventBusReceiverVerticle.lambda$start$1(EventBusReceiverVerticle.java:35)
    at com.company.verticals.EventBusReceiverVerticle$$Lambda$10/2029238960.handle(Unknown Source)
    at io.vertx.core.eventbus.impl.EventBusImpl$HandlerRegistration.handle(EventBusImpl.java:1108)
    at io.vertx.core.eventbus.impl.EventBusImpl.lambda$doReceive$189(EventBusImpl.java:755)
    at io.vertx.core.eventbus.impl.EventBusImpl$$Lambda$17/1888442711.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$15(ContextImpl.java:314)
    at io.vertx.core.impl.ContextImpl$$Lambda$9/911312317.run(Unknown Source)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:357)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)
    at java.lang.Thread.run(Thread.java:745)

我必须通过设置将Verticle设置为worker:

new DeploymentOptions().setWorker(true)

Another option is to increase the timeout 另一种选择是增加超时

VertxOptions options = new VertxOptions(); 
options.setMaxEventLoopExecuteTime(Long.MAX_VALUE);
vertx = Vertx.vertx(options);`

A key sentence in the Vertx documentation is Vertx文档中的关键句子是

Don't block me! 别封锁我!

You are getting the blocking message since you do execute blocking code in your Verticle. 您正在获取阻止消息,因为您在Verticle中执行阻止代码。 Calling Thread.sleep(10000) blocks your current verticle for 10 seconds. 调用Thread.sleep(10000)阻止当前的Verticle 10秒。

Declaring your Verticle as a worker is a workaround. 将Verticle声明为工作人员是一种解决方法。 Take a look in the Vertx documentation Executing blocking code . 请查看Vertx文档执行阻止代码 According to the documentation you could tell Vertx to execute Thread.sleep(10000) as blocking code. 根据文档,您可以告诉Vertx执行Thread.sleep(10000)作为阻止代码。

vertx.executeBlocking({ future ->
  // Call some blocking API that takes a significant amount of time to return
  Thread.sleep(10000)
  future.complete(result)
}, { res ->
  println("The result is: ${res.result()}")
})

Maybe you can explain the purpose of your test and why you use Thread.sleep(10000) ? 也许您可以解释测试的目的以及为什么使用Thread.sleep(10000)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM