2017-01-19 1 views
0

Dans mon application, le serveur registar à réseau qui notifier le rappel quand il y a de nouvelles informations. Le blocage du registarion réseau afin que je cours ce code avec blockHandler. Le problème est que l'enregistrement nécessite un rappel en tant que param et je veux exécuter le rappel dans la boucle d'événements. Comment puis-je le faire? le code réseau ne peut pas être modifié.exécuter le code dans la boucle d'événement de blockingHandler dans 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

Etes-vous sûr que la méthode 'registart' bloque? Il semble non bloquant car il a besoin d'un rappel. – tsegismont

+0

Peut-être juste l'exécuter dans le gestionnaire de résultat? – zella

+0

L'arrivée des données se fait par rappel et non-bloquant mais le registre du réseau bloque car il faut quelques secondes pour se connecter. à propos du gestionnaire de résultats - pouvez-vous expliquer? – user1137582

Répondre

0

Tous les verticles s'exécutent dans la boucle d'événements sauf indication contraire.
Si vous devez exécuter du code sur la boucle d'événements, tourner un verticle, et communiquer avec elle en utilisant EventBus:

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

Et votre « boucle événement verticle »:

class WorkerVerticle extends AbstractVerticle { 

    @Override 
    public void start() throws Exception { 

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

Si vous aussi besoin de recevoir quelque chose de la boucle d'événements, utilisez send() au lieu de publish()

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