2016-11-10 3 views
1

Ich habe eine Datenverarbeitung, die ich in einem Servlet namens "myServlet" (zum Beispiel) ausführe, manchmal bekomme ich eine Menge Daten zur gleichen Zeit zu verarbeiten, ich meine zur gleichen Zeit genau, ich brauche eine Möglichkeit, dem Client mitzuteilen, dass der Server ausgelastet ist.eine Möglichkeit zu überprüfen, ob das Servlet bereits verarbeitet - j2ee?

Ich habe versucht, ein Attribut im ServletContext auf false zu initialisieren, wenn die App startet, und dann, wann immer ich eine Anfrage erhalte, überprüfe ich, ob das Attribut false ist. Wenn es der Fall ist, ändere ich es in true So wird die nächste Anfrage fallen gelassen, solange ich gerade verarbeite. wieder funktioniert das nicht gut, wenn ich mehrere anfragen gleichzeitig bekomme, server verarbeite sie alle zur selben zeit, ich denke, dass einige anforderungen verschwinden, bevor ich das ctx-attribut auf TRUE ändere .... ich denke, dass ich fehlt bin etwas

, die Art und Weise ist ich frage mich, ob es Weg dorthin zu überprüfen ist, ob bereits eine Datenverarbeitung, so dass ich an diesem Punkt beenden und den Server ausgelastet Antwort an den Client

Hoffnung, dass Sie senden Jungs haben die Idee (das Problem)

dank im Voraus ...

+0

Erstellen Sie einen Servlet-Endpunkt, der den Status eines Prozesses zurückgibt. Dann sollte der Client den Endpunkt regelmäßig oder bei Bedarf nach dem Status abfragen. Schreiben Sie im Backend Code, um den Status – Mechkov

+0

zu behandeln, das ist eine gute Idee, das Problem ist, dass ich keine Kontrolle über den Client-Code habe, es ist eine API, die der Client verwendet, um Daten an den Server zu senden. !! –

Antwort

0

Sieverwenden können(statt boolesch im Kontext, halte diese Sperre im Kontext oder irgendwo - es sollte dieselbe Instanz über alle Anfragen an dieses Servlet sein), musst du auch die Sperroperation synchronisieren, um sicher zu sein, dass du jeden, der es wird, wieder beschäftigt Sie Anforderung in der Zeit, wenn der Server bereits besetzt ist, lesen Sie bitte die api und Beispiele für diese Klasse würde grundlegende Idee:

public class SomeService { 

    private final ReentrantLock lock = new ReentrantLock(); // or store it in context based on your needs 
    // ... 

    /** this method refuse to process if there is already ongoing processing */ 
    public void heavyProcessing() { 

    synchronized (lock) { 
     if (lock.isLocked()) { 
      // return busy status here 
      return;  
     } 

     lock.lock(); // acquire the lock - here we have the winner request that will be processed 
    } 
    try { 
     // ... do the processing here 
    } finally { 
     lock.unlock() 
    } 
    } 
} 

Es ist alles da „Out Of Order Execution“. ReentrantLock ist Thread-sicher, aber oder boolean ist nicht. Außerdem benötigen Sie eine Synchronisierung (den synchronized Block), um sicherzustellen, dass Sie den richtigen Status für die während der laufenden Verarbeitung anfallenden Werte angeben.

WEIL:

Ohne die richtige Synchronisation beetween Threads gibt es keine Garantie, dass der porgram in der genauen Reihenfolge ausgeführt wird, geschrieben steht (die Optimierungsmechanismen können die Reihenfolge der Ausführung ändern, wenn es nicht Single-Threaded-Programm beeinflussen würde). Um eine solche OOE-Optimierung zu verhindern, müssen Sie einige Synchronisationspunkte angeben. ReenterantLock ist in diesem Sinne konzipiert, boolean ist nicht. Die Verwendung von ReenterantLock setzt solche Synchronisationspunkte einfach in den ausgeführten Code, so dass Sie die richtige Synchronisation erhalten. Die Synchronisation zwischen Threads in Java ist ein sehr weites Thema, ich kann Ihnen hier nicht beibringen, wie es geht. Eines der guten Bücher zu diesem Thema ist "Java Concurrency in Practice". Ich schlage vor, zuerst dieses Buch zu lesen und dann zu fragen, ob etwas für Sie verwirrend sein könnte.

+0

danke dafür, aber denkst du nicht, dass es die gleiche Idee wie das Attribut im Kontext ist, werde ich nur einen boolean mit einem ReentrantLock ersetzen? –

+0

Nein, ist es nicht. Dieses Beispiel wird wirklich tun, was Sie brauchen. –

+0

OK, tut mir leid, dass ich nervig bin, aber ich verstehe immer noch nicht, warum es anders ist? wenn du ein bisschen abklären kannst !!! –

Verwandte Themen