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);
}