2017-01-09 5 views
1

Так что это немного подлый один, это не происходит 100% времени, но это ситуация:VertX тест по вопросам контекстных внедряющих Verticle

Я создал класс с JUnit интеграции, объявлен Rule для запуска в контексте, затем я извлекаю объект vertx из правила. Тогда я разворачивать новые verticles к vertx, и если попытаться развернуть более чем на ~ 3-4 verticles я получаю это для каждого Verticle:

Jan 09, 2017 2:43:33 PM io.vertx.core.impl.ContextImpl 
SEVERE: Unhandled exception 
java.lang.IllegalStateException: Result is already complete: succeeded 
    at io.vertx.core.impl.FutureImpl.checkComplete(FutureImpl.java:164) 
    at io.vertx.core.impl.FutureImpl.complete(FutureImpl.java:108) 
    at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:135) 
    at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:23) 
    at io.vertx.core.eventbus.impl.EventBusImpl.lambda$callCompletionHandlerAsync$2(EventBusImpl.java:340) 
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:316) 
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) 
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:418) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:440) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873) 
    at java.lang.Thread.run(Thread.java:745) 

код, вызывающий этот вопрос выглядит следующим образом:

@RunWith(VertxUnitRunner.class) 
public class VertxTest { 

    @Rule 
    public RunTestOnContext rule = new RunTestOnContext(Vertx::vertx); 

    @Test 
    public void testLinearExecution(TestContext context) { 
     Vertx vertx = rule.vertx(); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
     vertx.deployVerticle(new AbstractVerticle() { 
      @Override 
      public void start() throws Exception { 
       this.vertx.eventBus().consumer("bla", event -> {}); 
      } 
     }); 
    } 

} 

это может зависеть от машины, выполняющей его, но я думаю, что если он не воспроизводит, добавить больше тех парней, чтобы сделать его более вероятным:

vertx.deployVerticle(new AbstractVerticle() { 
    @Override 
    public void start() throws Exception { 
     this.vertx.eventBus().consumer("bla", event -> {}); 
    } 
}); 

Другое дело, говоря что если я меняю Vertx vertx = rule.vertx(); на Vertx vertx = Vertx.vertx();, я получаю предупреждающее сообщение на консоль, но проблема уходит.

Итак, я делаю что-то неправильно? Это проблема?

ответ

1

Вы используете версию 3.3.3. Вы можете столкнуться с этой проблемой: https://github.com/eclipse/vert.x/issues/1625 (исправлено в главном)

+0

Это исправлено в текущей версии (3.4.1) и, возможно, раньше. –