Una webapp backend viene distribuita su un contenitore di servlet Tomcat 6. Nella webapp vengono avviati diversi thread di monitoraggio. Il problema è con l'arresto.Come eliminare correttamente i thread locali di proprietà di una webapp in esecuzione su tomcat con istruzioni per lo spegnimento
- Come faccio a sapere che la webapp è richiesta per l'arresto?
- Come devo gestirlo nei miei thread?
Attualmente il mio thread è implementato come di seguito. Quando il servlet viene istruito su shutdown (shutdown.sh) completa un arresto pulito e non si blocca a causa di questo thread - Perché?
class Updater extends Thread {
volatile boolean interrupted = false;
@Override
public void run() {
Integer lastUpdateLogId = CommonBeanFactory.getXXX()
.getLastUpdateLogRecordKey(MLConstants.SMART_DB_NAME);
List<UpdateLog> updateLogRecords;
while (!interrupted) {
boolean isConfigurationUpdateRequested = false;
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
setInterrupted(true);
}
updateLogRecords = CommonBeanFactory.getXXX()
.getLastFactsUpdateLogRecords(MLConstants.XXXX, lastUpdateLogId);
for(UpdateLog updateLog : updateLogRecords) {
if (updateLog.getTable_name().equals(MLConstants.CONFIG_RELOAD)) {
isConfigurationUpdateRequested = true;
}
lastUpdateLogId = updateLog.getObjectKey();
}
if (isConfigurationUpdateRequested) {
Configuration.getInstance().loadConfiguration();
}
}
}
public boolean getInterrupted() {
return interrupted;
}
public void setInterrupted(boolean interrupted) {
this.interrupted = interrupted;
}
}