どうも、ピルティです。
直近で起きた問題としてSpringで「@Scheduledで定期的に実行するように設定した処理が2重に呼び出される」ということが起こりました。
色々探しまわった結果、以下の様なQ&Aを見つけて対応出来ました。
幾つか修正案が出ていますが、僕の場合は@Scheduledを定義しているクラスが2重に生成されていたのが原因でした。
まず、僕はこの処理のためのxml定義ファイルに以下のように記述していました。
<task:annotation-driven scheduler="poolTaskScheduler" /> <bean id="SchduledHandler" class="jp.ne.piruty.SchduledHandler" />
SchduledHandlerの実装は@Componentを定義し、もろもろAutowiredして使うようにしていました。
@Component public class SchduledHandler{ @Autowired private SchduledService schduledService; @Scheduled(fixedRate = 60 * 1000) public doTask() { schduledService.doSomething(); } }
そして、先ほどのxml定義ファイルをSpringのContextListnerで読み込むようにしてしていました。
すると、SchduledHandlerがxml定義ファイルで一度生成され、さらに@Componentなのでbeanとしても生成されるということで、2重に処理が呼ばれてしまっていたようです。
なので、今回の対処法としてはxml定義ファイルから<bean id="SchduledHandler" class="jp.ne.piruty.SchduledHandler" />
の記述を削除することで対応出来ました。
上記リンクでも書かれていますが、xml定義ファイルでtask:annotation-driven
を定義しているので@Scheduledは問題なく動作します。また、@Componentなので、これはbeanとして生成されるので、アプリを起動すれば自動的に作られます。
以上です。