2
public class ProcessSchedulerServlet implements javax.servlet.Servlet {
    Timer timer=new Timer();

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            LogProcessorService logProcessorService=new LogProcessorServiceImpl();
            logProcessorService.processPageRequestsLogs();
        }
     }, 60*1000, 120*1000);
}

とにかく、これは醜く、機能しません。LogProcessorServiceImpl には、@Autowired アノテーションを持つプロパティがあります。これらのプロパティは、このコードの実行時に自動配線されません。これは予想されるかもしれません。

本当の問題は、この run() メソッドを機能させる方法です。Spring は、logProcessorService を自動配線して、LogProcessorServiceImpl 内のプロパティも自動配線することを望んでいるように思えます。

=== シナリオ 1 ============================================ =================

public void run() {
    final LogProcessorService logProcessorService=null;
    WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()).getAutowireCapableBeanFactory().autowireBean(logProcessorService);
    logProcessorService.processPageRequestsLogs();
}

結果: コンパイル時エラー: 別のメソッドで定義された内部クラス内の非最終変数 arg0 を参照できません

=== シナリオ 2 ============================================ =================

@Autowired
LogProcessorService logProcessorService;
public void run() {
    logProcessorService.processPageRequestsLogs();
}

結果: 実行時エラー: logProcessorService が null です。

==== SOLUTION (ボリスより) ======================================== =============

public class ProcessSchedulerServlet implements javax.servlet.Servlet {
    Timer timer=new Timer();

    @Autowired
    LogProcessorService logProcessorService;

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        final AutowireCapableBeanFactory autowireCapableBeanFactory=WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()).getAutowireCapableBeanFactory();
        autowireCapableBeanFactory.autowireBean(this);

        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                logProcessorService.processPageRequestsLogs();
            }
        }, 60*1000, 120*1000);
}
4

1 に答える 1

4

Springにスケジューリングサポートが組み込まれているのに、なぜサーブレットとTimerクラスを気にするのですか?

@Service
public class LogProcessorService {

    @Scheduled(fixedRate=120*1000, initialDelay=60*1000)
    public void processPageRequestsLogs() {
        //...
    }

}

それでおしまい!タイマー、ランナブル、サーブレットはありません。注:initialDelaySpring 3.2 M1で導入されました(SPR-7022を参照)。

于 2012-11-18T11:56:42.243 に答える