@Scheduled Annotation を使用して定期的にワーカー タスクを実行する (スケジュールされた遅延) Web アプリケーション (Spring 3.1 を使用) があります。ワーカー タスクは AWS DynamoDb への接続を開き、DB の読み取り/更新を行います。(Tomcat マネージャーから) webapp を停止すると、catalina.out に次のメッセージが表示されます。
「重大: Web アプリケーション [] は、[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();
}
}
}
ディスパッチャーサーブレット.xml:
<task:annotation-driven scheduler="taskScheduler"/>
<task:scheduler id="taskScheduler" pool-size="2"/>
......
<bean id="TaskScheduler" class="com.sample.TaskScheduler"/>
私はこれを正しくやっていますか?a) TaskScheduler を明示的に開始しません。したがって、春がこのサービスの開始を処理すると想定しています。「this.myDbConn.shutdown()」が呼び出されます。それにもかかわらず、エラーが発生します。Spring MVC を使用しています。