Ho un'applicazione Web (utilizzando Spring 3.1) che utilizza l'annotazione @Scheduled per eseguire periodicamente un'attività di lavoro (ritardo pianificato). L'attività di lavoro apre una connessione a AWS DynamoDb e esegue alcuni read/updates del DB. Quando interrompo la webapp (da Tomcat manager) ottengo questo messaggio in catalina.out:Spring MVC WebApp: @schedule: java-sdk-http-connection-reaper: impossibile arrestare
"SEVERE: l'applicazione Web [] sembra aver avviato un thread denominato [java-sdk-http-connection-reaper] ma non è riuscito a fermarlo, è molto probabile che crei una perdita di memoria. "
Ho la sensazione che questo abbia qualcosa a che fare con il mio task programmato ancora in esecuzione anche dopo l'arresto di Tomcat.
@Service
public class TaskScheduler implements ApplicationListener<ContextClosedEvent>{
@Autowired
private WorkerTask workerTask;
AmazonDynamoDBClient myDbConn = null;
private TaskScheduler() {
myDbConn = new AWSConnector("aws.properties").getDynamoConnection();
}
/*
* Will be repeatedly called, 10 seconds after the finish of the previous
* invocation.
*/
@Scheduled(fixedDelay=100000)
public void process() {
System.out.println("Scheduling worker task");
//worker task does some db read/writes
Future<String> status = workerTask.work(myDbConn);
if (status.isDone()) {
System.out.println("Completed Task");
return;
}
}
@Override
public void onApplicationEvent(ContextClosedEvent arg0) {
if(event instanceof ContextClosedEvent) {
// TODO Auto-generated method stub
if(myDbConn != null) {
this.myDbConn.shutdown();
}
}
}
dispatcher-servlet.xml:
<task:annotation-driven scheduler="taskScheduler"/>
<task:scheduler id="taskScheduler" pool-size="2"/>
......
<bean id="TaskScheduler" class="com.sample.TaskScheduler"/>
me lo fa fare correttamente? a) Non avvio esplicitamente TaskScheduler. Quindi presumo che la primavera si occupi di avviare questo servizio. Viene chiamato 'this.myDbConn.shutdown()'. Nonostante questo, ottengo l'errore. Sto usando Spring MVC.
Mi piace questa risposta anche se sotto potrebbe funzionare. Dal momento che sto consumando SDK AWS da un altro contenitore di cui non sono a conoscenza internals. –