2017-10-25 1 views
0

ich den Aufbau eines Boten wie Server Umgang habe ich einige Änderungen wie dieseMultithreading Vert.x, um Tausende von Verbindungen pro Sekunde

vertx.deployVerticle(MainDeployment.class.getCanonicalName(),res -> { 
      if (res.succeeded()) { 

       Logger.Log("Deployed"); 

       } else { 
       Logger.Log(res.cause().getMessage()); 
       } 
      }); 

    server.requestHandler(router::accept).listen(port); 


public void createContext(String path,MyHttpHandler handler){ 
    //handlersMap.put(path.split("\\/")[1], handler); 
    if(!path.endsWith("/")){ 
     path += "/"; 
    } 

    path+="*"; 

    map.put(path, handler); 
} 

und hier meine MainDeployment Klasse

Vert.x
public class MainDeployment extends AbstractVerticle{ 



    @Override 
    public void start() throws Exception { 

     //GUI.display("Sub Verticle Has Deployed"); 

    // Different ways of deploying verticles 

    // Deploy a verticle and don't wait for it to start 

    for(Entry<String, MyHttpHandler> entry : MyVertxServer.map.entrySet()){ 
     MyVertxServer.router.route(entry.getKey()).handler(new Handler<RoutingContext>() { 

      @Override 
      public void handle(RoutingContext ctx) { 

       String[] handlerID = ctx.request().uri().split(ctx.currentRoute().getPath()); 

       String suffix = handlerID.length > 1 ? handlerID[1] : null; 
       entry.getValue().Handle(ctx, new VertxUtils(), suffix); 

      } 
     }); 
    } 

    } 
} 

die Dokumentation sagt

Vert.x guarantees that a particular verticle instance is never executed by more than one thread concurrently. This gives you a huge advantage as a developer, since you can program all your code as single threaded 

da jeder verticle einen eigenen Thread hat und sein Single th readed, wenn also meine verticle Dateien hochlädt, kann es nicht 2 Uploads gleichzeitig verarbeiten oder missverstehe ich das Konzept von NIO?

+0

Was haben die bereitgestellten Quellen mit dem Multithread-Problem zu tun? – tmarwen

+0

nichts so weit wie ich suchte, aber sie alle erwähnen grundlegende Verwendungen. Soooo viele Beispiele, aber keine von ihnen bieten solche Informationen – Reza

Antwort

1

Ich denke, Sie sollten tiefer graben durch die Vert.x Dokumentation, um mehr vertraut mit der Unterstützung API und Design.

Die offizielle Dokumentation, die ich sehr Beratung, besagt Folgendes:

Auch wenn ein Vertx Instanz mehrere Ereignisschleifen, eine bestimmte Handler hält nie gleichzeitig, und in den meisten Fällen durchgeführt werden (mit Ausnahme von Worker-Verticles) wird immer mit der exakt gleichen Event-Schleife aufgerufen.

  • Entweder API Vertx#executeBlocking
  • oder innerhalb eines durch Verwendung der Blockierung:

Der Datei-Upload Prozess, den Sie implementieren möchten, wird, soll ausgeführt werden somit ein Blockierung Betrieb betrachtet Arbeiterpool, der erhalten werden kann durch Vertx#createSharedWorkerExecutor Anruf

Beide Weg führt in dem Ereignisse-Loop Thread mit Sperroperationen nicht halt zu sein (Ich stelle denEreignis-Schleife Faden aber wir reden eigentlich über den ganzen Ereignis-Loop Fäden, wie sie können mehr als eins sein).

+0

so vertx ist nicht für große Dateiserver nützlich? – Reza

+0

In der Tat ist es, aber Sie sollten Ihre Anwendung sorgfältig entwerfen, so dass es nach Bedarf skalieren kann. Selbst ein * Datei-Upload * -Prozess wird als blockierend betrachtet, da viele Mitarbeiter hinterher (mit einer Cluster-Konfiguration als Plus) Ihre Anforderungen erfüllen können. – tmarwen

+0

danke viel. also werde ich langlebige arbeiten mit executor handhaben und senden, empfange files mit Pump und sendFile() – Reza

Verwandte Themen