Ich habe eine Webanwendung (mit Spring 3.1) die @ Scheduled Annotation für die regelmäßige Ausführung einer Worker-Task (geplante Verzögerung) verwendet. Die Worker-Aufgabe öffnet eine Verbindung zu AWS DynamoDb und führt einige DB-Lese-/Aktualisierungsvorgänge aus. Wenn ich die Webapp (von Tomcat-Manager) stoppe bekomme ich diese Nachricht in catalina.out:Spring MVC WebApp: @ Schedule: java-sdk-http-Verbindung-Reaper:
"SEVERE: Die Webanwendung [] scheint einen Thread mit dem Namen [java-sdk-http-connection-reaper] gestartet zu haben aber es ist nicht gelungen, das zu stoppen. Dies führt sehr wahrscheinlich zu einem Speicherleck. "
Ich habe das Gefühl, dass dies etwas mit meiner geplanten Aufgabe zu tun hat, auch nachdem Tomcat gestoppt hat.
@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"/>
Bin ich dies richtig tun? a) Ich starte den TaskScheduler nicht explizit. Also nehme ich an, der Frühling kümmert sich darum, diesen Service zu beginnen. Die 'this.myDbConn.shutdown()' wird aufgerufen. Trotzdem bekomme ich den Fehler. Ich benutze Spring MVC.
Ich mag diese Antwort, obwohl unten funktionieren könnte. Da ich AWS SDK in einem anderen Glas konsumiere, dessen Inneres mir nicht bekannt ist. –