Pensavo che non lo fosse, ma ieri dovevo farlo. È un'applicazione che utilizza Akka (un'implementazione del sistema attore per la JVM) per elaborare lavori asincroni. Uno degli attori esegue alcune manipolazioni di PDF e poiché la libreria è difettosa, muore di StackOverflowError
tanto in tanto.
Il secondo aspetto è che Akka è configurato per arrestare l'intero sistema dell'attore in caso di errore fatale JVM (ad es. StackOverflowError).
Il terzo aspetto è che questo sistema attore è incorporato in un'app Web (per WTF-ish, legacy, ragioni), quindi quando il sistema attore viene spento, l'app Web non lo è. L'effetto netto è che su una StackOverflowError
nostra applicazione di elaborazione dei lavori diventa solo un'app Web vuota.
Come soluzione rapida ho dovuto catturare l' StackOverflowError
essere lanciato, in modo che il pool di thread del sistema attore non venisse demolito. Questo mi ha portato a pensare che forse a volte va bene cogliere tali errori soprattutto in contesti come questo? Quando c'è un pool di thread che elabora attività arbitrarie? A differenza di un OutOfMemoryError
non riesco a immaginare come si StackOverflowError
possa lasciare un'applicazione in uno stato incoerente. Lo stack viene cancellato dopo tale errore, quindi il calcolo può continuare normalmente. Ma forse mi manca qualcosa di importante.
Inoltre, si noti che sono tutto per correggere l'errore in primo luogo (in realtà ho già risolto un SOE in questa stessa app qualche giorno fa), ma davvero non so quando questo potrebbe sorgere un tipo di situazione.
Perché sarebbe meglio riavviare il processo JVM invece di catturare StackOverflowError
, contrassegnare quel lavoro come fallito e continuare con la mia attività?
C'è qualche motivo convincente per non catturare mai SOE? Tranne "buone pratiche", che è un termine vago che non mi dice nulla.
StackOverflowException
s sono generalmente dovuti a una catena non terminante di chiamate al metodo - aumentando lo spazio dello stack si aumenterebbe quindi il costo della memoria di un nuovo thread senza alcun vantaggio.
:-)