Springの@Schduledが2重で実行される時の考察点

どうも、ピルティです。

直近で起きた問題としてSpringで「@Scheduledで定期的に実行するように設定した処理が2重に呼び出される」ということが起こりました。
色々探しまわった結果、以下の様なQ&Aを見つけて対応出来ました。

stackoverflow.com

幾つか修正案が出ていますが、僕の場合は@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として生成されるので、アプリを起動すれば自動的に作られます。

以上です。