質問: 0; @Override public void run() { System.out.println(testCount + "回目"); testCount++; } public static Schedule getInstance() { return instance; } } ``` ### 試したこと ScheduleManagerクラスやScheduleクラスをシングルトンクラスにしてみたりしましたが、実行結果が以下のようになってしまいます。 webアプリを再配置する毎に処理が重複されて定期実行されてしまいます。 なお、Tomcatを再起動すればまた"1回目"から始まりますが、運用上Tomcatを止める事は出来ません。 ``` 113回目 63回目 91回目 114回目 64回目 92回目 115回目 65回目 93回目 116回目 66回目 94回目 ``` ### 望んでいる実行結果 ``` 1回目 2回目 3回目 4回目←ここでwebアプリを再配置したとすると stop run start run 1回目 2回目 3回目 4回目 ``` ### FW/ツールのバージョンなど apache-tomcat-7.0.78 ### 補足 お恥ずかしいですが独学で学んでいるため、笑ってしまうような実装があるかと思います。 出来れば今回の質問の本題以外のご指摘もありましたら是非宜しくお願いします。 また、質問内容に不備がありましたら追記致します。 お手数お掛け致しますが助言を宜しくお願いします。 --- > > 内容から見るとデプロイされている間というのはそのデプロイ中(初期化処理中)ではなくリリース完了後以降(初期化終了後)と読み替えていいですか? > > > 仰る通りです。質問内容を訂正します。 > > またさらに内容見ると、どちらかというと定期処理をデプロイ時に初期化したいと読み取れるのですが、あってますか? > > > 仰る通りです。質問内容を訂正します。 --- 以下のようなリスナーを追加したところ、もしかしたらうまく動いているかもしれません。 その他の解決方法やご指摘等ありましたら宜しくお願い致します。 ``` public class InitializationListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { // 起動を検知 System.out.println("/////////////////////////////////////////////////////////////////"); System.out.println("Initialized"); System.out.println("/////////////////////////////////////////////////////////////////"); ScheduleOutput.getInstance().startTimer(); } @Override public void contextDestroyed(ServletContextEvent event) { //終了を検知 System.out.println("/////////////////////////////////////////////////////////////////"); System.out.println("Destroyed"); System.out.println("/////////////////////////////////////////////////////////////////"); ScheduleOutput.getInstance().stopTimer(); } ```
回答: Servletのinit(ServletConfig config) はデフォルトの設定だと、ホットデプロイ時には実行されません。 アプリケーションのホットデプロイ後にinitメソッドを実行させたい場合は、 ``` @WebServlet(urlPatterns="/", loadOnStartup=1) ``` サーブレットにloadOnStartup属性をつけ、-1以外にするとよいでしょう。