2017-01-19 1 views
0

В моем приложении сервер регистрируется в сети, которая уведомляет обратный вызов при появлении новой информации. Сетевой регистратор блокирует, так что я запускаю этот код с blockHandler. Проблема в том, что для регистрации требуется обратный вызов как параметр, и я хочу запустить обратный вызов в цикле событий. как мне это сделать? Сетевой код не может быть изменен.код запуска в цикле событий из blockingHandler в vertx

vertex.executeBlocking(event->{ 
     network.registart(new CallBack(){ 
      public void newData(Data d) 
      { 
        runThisCodeInEventLoop(); // I want to run this code in the event loop. 
        event.complete(); 
      } 
     },false,ev->{ 
      ....some code... 
     } 
} 
+0

Вы уверены, что метод 'registart' блокирует? Это кажется неблокирующим, поскольку для этого требуется обратный вызов. – tsegismont

+0

Возможно, просто запустите его в обработчике результатов? – zella

+0

Поступление данных происходит с помощью обратного вызова и неблокирования, но регистр в сети блокируется, так как для подключения требуется секунда. о обработчике результатов - можете ли вы объяснить? – user1137582

ответ

0

Все вертицы запускаются в цикле событий, если не указано иное.
Если вам нужно выполнить некоторый код на цикл событий, плести Verticle, и общаться с ним, используя EventBus:

public void newData(Data d) 
      { 
        // This will go back to the event loop 
        vertx.eventBus().publish("channel", "something"); 
        event.complete(); 
      } 

И ваш «Verticle цикл событий»:

class WorkerVerticle extends AbstractVerticle { 

    @Override 
    public void start() throws Exception { 

     vertx.eventBus().consumer("channel", (o) -> { 
      // Do something smart here 
     }); 
    } 
} 

Если вы также должны получить что-то из цикла событий, используйте send() вместо publish()

http://vertx.io/docs/vertx-core/java/#_the_event_bus_api

Смежные вопросы