Töten ein stuck thread auf eine laufende VM (JBoss-Instanz) in Java?
Einen Fehler in der externen Bibliothek verursacht eine Endlosschleife, in der ein worker-thread auf einem JBoss-Instanz von mir. Kennen Sie einen Weg, um zu töten dieser "stecken" - thread, ohne den server neu starten? Wir möchten in der Lage sein, um sich davon zu erholen, bis ein Update bereitgestellt wird, vorzugsweise ohne dass ein Neustart.
Ich habe gesehen, ein paar Leute erwähnen mit Gewinde.interrupt() - wenn ich code meine eigenen MBean, wie würde ich das in den Griff bekommen, um den thread in Frage stellen, um zu unterbrechen?
Update: War nicht in der Lage zu lösen, mit einer der folgenden Methoden. Ich kam über ein weiterer thread über das gleiche Problem, der hatte einen link auf warum Thread.stop() ist deprecated. Hat jemand fragte eine ähnliche Frage mit ähnlichen Ergebnissen. Wie es scheint, mehr anspruchsvolle Behälter sollte diese Art von Gesundheits-Mechanismus, aber ich denke, Ihnen sind die Hände gebunden w/r/t die JVM.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich einen ähnlichen bug (Endlosschleife) in eine 3rd-party lib. Ich landete anwenden des Updates selbst (während der Wartezeit für die Leute aus dem 3rd-party-lib zu beheben, Ihre Durcheinander) und dann setzte ich die geänderte .Klasse in meinem .Krieg, machen Sie sicher, dass es geladen wird, bevor der Schein .Klasse (das Schein ein Wesen in die falsche 3rd-party -.jar).
Es ist nicht schön, aber es funktioniert, siehe meine Frage hier:
Um für das laden der Klassen aus .war-Datei
Was ich meine, ist dieses: wenn Sie warten, für die Menschen verantwortlich für die 3rd-party-verbuggt lib zu beheben, die Ihre Sachen, Sie können möglicherweise auf sich warten lassen sehr lange Zeit. Wir konnten uns nicht leisten. Wir brauchten ein Update so bald wie möglich. So landeten wir anwenden ein patch/hack, um Ihren code.
Könntest du zum Beispiel hinzufügen eines boolean check in der Endlosschleife und dann zwingt die Schleife zu beenden, wenn Sie wollen, dass die Schein-thread "sterben".
Hinweis, dass ich noch nicht verwendet, die veralteten Thread stop() seit zehn Jahren, und ich wirklich nicht wollen, es zu benutzen in oben genannten Fall.
Ich nehme an, der schwierigste Teil ist, zu identifizieren, den hängenden thread. Sie bieten keine info darüber, aber vielleicht können Sie bauen einige Regeln, um den thread-Namen oder seine aktuellen stack-trace.
Wenn Sie identifizieren können, der thread durch seinen Namen, ich würde alle threads in der VM immer meine eigenen thread-Gruppe mit
Thread.currentThread().getThreadGroup()
, dann zu Fuß bis die thread-Gruppen-Hierarchie durch BerufunggetParent()
auf die thread-Gruppe, bis es wiedernull
. Sie haben nun die top-level-thread-Gruppe. Sie können nun füllen Sie eine fest zugewiesene array mit allen threads mit derenumerate(Thread[] list)
Methode auf die top-level-thread-Gruppe.Wenn Sie die stack-traces ohnehin zu identifizieren, die Gewinde, können Sie auch die statische utility-Methode
Map<Thread,StackTraceElement[]> Thread.getAllStackTraces()
um alle threads. Berechnung des stack-traces ist allerdings Recht teuer, so könnte dies nicht die beste Lösung, wenn Sie nicht tatsächlich benötigen.Nach der Identifizierung der Faden, den Sie aufrufen müssen, die
stop()
- Methode auf. Unterbrechung es wird nicht helfen, es sei denn, die Durchführung des Laufenden code tatsächlich wertet der thread unterbrochen Flagge und verhält sich so, wie Sie es erwarten. Nicht, dass diestop()
Methode ist veraltet und die Verwendung kann es viele lustige Nebenwirkungen. Sie können mehr details finden Sie in der API-Dokumentation.Könnten Sie entmutigt myThread.stop () - Methode. Dann ist es aber sehr wahrscheinlich ist der Thread noch referenziert, so dass Sie verwenden sollte, einige Reflexion Magie entfernen Sie alle Verweise auf diesen thread, von den Komponenten, die Sie halten.
Wie, den Thread zu finden? Verwenden Sie Thread.getThreadGroup() und ThreadGroup.getThreadGroup() zu gehen, die Wurzel ThreadGroup(), und verwenden Sie dann die iterate () - Funktionen gehen durch alle threads.
Versuchen, mein jkillthread, die versucht, so etwas zu tun.