2017-06-21 1 views
1

Ich stelle eine zustandslose EJB als REST-Service zur Verfügung. In meiner POST-Methode, nenne ichJava: Abbrechen der Ausführung der REST-Servicemethode

Result r = longRunningBusinessMethod(); 
//return data 

Wie gehe ich über die es ermöglicht, die Ausführung von longRunningBusinessMethod() von der Client-Seite zu löschen? Ich dachte daran, einen Thread für die Methode zu erstellen und alle ausführenden Threads in einer Hashtabelle zusammen mit einer ID zu behalten, damit der Benutzer seine ID POSTIEREN kann, um den Thread zu beenden. Aber ich bin mir sicher, dass es eine bessere Lösung geben muss. Jede Hilfe wird geschätzt.

Antwort

1

Ich denke, das grobe Design von "einen Tisch IDs halten" ist ein guter Ausgangspunkt. Anstatt den Thread extern zu beenden, würde ich wahrscheinlich einen ExecutorService mit einem Thread-Pool verwenden und dann eine Map<ID, Future> behalten, damit Sie die Zukunft abbrechen können. (Auch dafür sorgen, dass jede Zukunft selbst von der Karte entfernt, wie es erfolgreich oder vervollständigt außergewöhnlich.)

Sie werden auch die longRunningBusinessMethod zu implementieren, so dass es genügend Plätze enthält, wo es überprüft, ob sie unterbrochen worden ist - Das Abbrechen einer Zukunft setzt nur das unterbrochene Flag auf dem Thread, es stoppt den Code nicht tatsächlich. Wenn Ihre lang laufenden Methoden bereits InterruptedException auslösen, ist es in Ordnung. Andernfalls müssen Sie entweder Dummy-Anrufe wie Thread.sleep(1) hinzufügen, oder manuell Thread.interrupted() überprüfen, und werfen Sie die InterruptedException selbst.

+0

So werde ich es machen. Und ich wusste nicht, dass ich meinen Thread manuell beenden musste. Kurze und verwandte Frage: Wenn ich 'Future # get (30, TimeUnit.Seconds) 'verwende, wird die zugrunde liegende Methode immer noch ausgeführt, nachdem die Timeout-Ausnahme ausgelöst wurde? – User9123

+0

Wenn die Zeitüberschreitungsausnahme ausgelöst wird, wird die zugrunde liegende Methode _may_ noch ausgeführt. Dadurch wird nur das "unterbrochene" Flag für den Thread gesetzt, der den 'longRunningBusinessMethod' ausführt, so dass der Code immer noch so geschrieben werden muss, dass er unterbrechbar ist. –

1

Das Unterbrechen von Arbeitsfäden ist immer schwierig und im Allgemeinen nicht zu empfehlen. Eine Möglichkeit besteht darin, die laufende Geschäftsmethode zu ändern, um zu fragen, ob sie ihre Ausführung abschließen soll. Zum Beispiel:

public void longRunningBusinessMethod(JobContext context){ 
    while(someCondition) { 
     if(shouldInterrupt(context)){ 
      log.info("Interrupting longRunningBusinessMethod"); 
      ... 
      <close all the resources and terminate the job> 
     } 
    } 
} 

Der shouldInterrupt(context) wird Job Zusammenhang mit Job-ID in ihr stattfinden und DB oder Cache fragen, ob sie unterbrochen werden sollte. Dann ist es einfach, den 'sentInterrup' -Wert in DB oder Cache für diesen bestimmten Job über die REST-API zu ändern.

Verwandte Themen