У меня есть веб-приложение (с использованием Spring 3.1), которое использует @Scheduled Annotation для периодического выполнения рабочего задания (запланированная задержка). Рабочая задача открывает соединение с AWS DynamoDb и выполняет некоторые чтения/обновления БД. Когда я останавливаю webapp (от менеджера Tomcat), я получаю это сообщение в catalina.out:
"SEVERE: веб-приложение [], похоже, начало поток с именем [java-sdk-http-connection-reaper], но не смог его остановить. Вероятно, это создает утечку памяти."
У меня возникает ощущение, что это связано с тем, что моя запланированная задача все еще работает даже после остановки 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();
}
}
}
диспетчер-servlet.xml:
<task:annotation-driven scheduler="taskScheduler"/>
<task:scheduler id="taskScheduler" pool-size="2"/>
......
<bean id="TaskScheduler" class="com.sample.TaskScheduler"/>
Я делаю это правильно? a) Я не запускаю TaskScheduler явно. Поэтому я предполагаю, что Spring заботится о запуске этой службы. Вызывается "this.myDbConn.shutdown()". Несмотря на это, я получаю ошибку. Я использую Spring MVC.