2012-11-18 4 views
1
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 аннотацией. При запуске этого кода эти свойства не автоувеличиваются. Это можно ожидать.Как проехать автостраду?

Реальный вопрос: как это сделать работать() метод работать. Мне кажется, что Spring хочет, чтобы функция logProcessorService была автоматически отлажена, чтобы иметь свойства в Autovired 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 нулевой;

==== РЕШЕНИЕ (от Бориса) ========================================== =================

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

что не так с руководством по автопостановке, показанным в [моем ответе] (http://stackoverflow.com/questions/13437741/why-would-spring-autowire-fail/13437803#13437803)? Почему вы создаете LogProcessorService с новым оператором вместо делегирования его создания в контейнер Spring? –

+0

Борис, ничего, что я пытаюсь, работает. Я просто отправляю другой вопрос с меньшей информацией и более прямой проблемой, чтобы люди не переваривали всю мою логику. Это прямо сейчас должно быть очень простой проблемой для понимания. Невозможно autowire статическое свойство, поэтому я пытаюсь выполнить реализацию напрямую. Не повезло. Что бы вы сделали с этим? Ответ должен иметь дело непосредственно с двумя строками в методе run(). – jacekn

+0

RE 'LogProcessorServiceImpl имеет свойства с @Autowired annotation', что означает, что это скорее Spring; вы все равно можете выполнять ручное автообучение 'WebApplicationContextUtils.getWebApplicationContext (arg0.getServletContext()) .getAutowireCapableBeanFactory(). autowireBean (logProcessorService);' но нет объективной причины для этого, так как предполагается, что это будет Spring bean - то есть созданный и автообновленный с помощью Весенний контейнер. –

ответ

3

Зачем беспокоиться сервлет и Timer класса, если весна имеет built in scheduling support:

@Service 
public class LogProcessorService { 

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

} 

Вот именно! Нет таймеров, runnables и сервлетов. Примечание: initialDelay был представлен весной 3.2 M1 (см. SPR-7022).

+0

Уведомление что вопрос не о таймере.Таймер прост в использовании и дает мне возможность динамически планировать события.Я использовал здесь базовый пример, потому что больше кода путало бы проблему. И проблема заключалась в следующем: как получить Spring для автосогласования службы в TimerTask, который Boris выяснил. – jacekn

+0

@jacekn: Я понимаю. С другой стороны, вы можете переместить обработку Timer на другие весенние бобы, чтобы упростить автоустановку. Тем не менее, я не хочу удалять свой ответ, так как мало кто его нашел интересно, пожалуйста, включите комментарии под своим вопросом в ответ (или попросите Бориса сделать это) и примите его. –

+0

@jacekn этот ответ отлично отвечает на вопрос, API-интерфейс Spring scheduling он, конечно, пошел. SO об обмене информацией, и это нормально, чтобы получить ответ, который каким-то образом критикует подход, используемый в вопросе - мы все учащиеся здесь http://meta.stackexchange.com/questions/8891/is-dont-do -it-a-valid-answer –

Смежные вопросы