Tôi có một ứng dụng web (sử dụng Spring 3.1) sử dụng @Scheduled Annotation để thực hiện một nhiệm vụ công việc định kỳ (chậm trễ theo lịch trình). Task worker mở một kết nối tới AWS DynamoDb và thực hiện một số DB đọc/cập nhật. Khi tôi dừng webapp (từ người quản lý Tomcat), tôi nhận được thông báo này trong catalina.out:Spring MVC WebApp: @schedule: java-sdk-http-connection-reaper: Không thể dừng
"SEVERE: Ứng dụng web [] dường như đã bắt đầu một chuỗi có tên [java-sdk-http-connection-reaper] nhưng đã thất bại trong việc ngăn chặn nó. Điều này rất có khả năng tạo ra rò rỉ bộ nhớ. "
Tôi có cảm giác rằng việc này có liên quan đến tác vụ đã lên lịch của tôi vẫn chạy ngay cả sau khi Tomcat dừng.
@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();
}
}
}
phối-servlet.xml:
<task:annotation-driven scheduler="taskScheduler"/>
<task:scheduler id="taskScheduler" pool-size="2"/>
......
<bean id="TaskScheduler" class="com.sample.TaskScheduler"/>
Am Tôi làm điều này một cách chính xác? a) Tôi không khởi động TaskScheduler một cách rõ ràng. Vì vậy, tôi giả định mùa xuân sẽ chăm sóc bắt đầu dịch vụ này. 'This.myDbConn.shutdown()' được gọi. Mặc dù vậy, tôi nhận được lỗi. Tôi đang sử dụng Spring MVC.
Tôi thích câu trả lời này mặc dù bên dưới có thể hoạt động. Vì tôi đang tiêu thụ AWS SDK từ bên trong một cái lọ khác mà tôi không biết. –