2015-02-17 2 views
2

Я использую Spring и создал веб-приложение. В моем веб-приложении у меня есть служба отдыха. У меня есть один метод отдыха, называемый процессом, который принимает данные пользователя (от углового ui) и сохраняет данные пользователей в базе данных (SQLite).Весна и запланированная/повторная задача

В основном я хочу, чтобы пользователь инициировал вызов для отдыха. Я хочу начать отдельный поток (из которого только будет существовать). Этот поток будет опроса базы данных для определенных значений и электронной почты администратора, если определенные значения будут найдены. Мне нужно, чтобы класс был потокобезопасным. См. Ниже. Правильно ли я использую что-то вроде этого? Нужна ли мне аннотация @Async? Или я должен использовать TimerTask вместо этого?

@EnableScheduling 
public class DBPoller { 

    @Scheduled(fixedRate = 5000) 
    public void checkDatabase() { 
     //checks the db for certain values 
    } 
} 
+0

Какой дб? Если PostgreSQL, можете использовать NOTIFY: http://stackoverflow.com/questions/21632243/how-do-i-get-asynchronous-event-driven-listen-notify-support-in-java-using-ap/23352527#23352527 –

+0

Привет, db он использует SQLite. – Silmarillion

ответ

-1

Это звучит, как вы хотите использовать @Async аннотацию. @Scheduled на самом деле не достигнет эффекта, который вы пытаетесь достичь. @Scheduled будет работать, если вы пытались запустить этот сценарий проверки/электронной почты с фиксированными интервалами времени, а не по запросу пользователя. К счастью, конфигурация для обоих одинакова.

<task:annotation-driven scheduler="scheduler" 
    executor="asyncMethodTaskExecutor" /> 

<task:scheduler id="scheduler" pool-size="x" /> 

<bean id="asyncMethodTaskExecutor" 
    class="org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor"> 
    <property name="threadCount" value="y"/> 
    <property name="threadNamePrefix" value="AsyncMethodWorkerThread"/> 
</bean> 

Если у вас есть @EnableScheduling аннотацию, вам не нужно определить <task:scheduler id="scheduler" pool-size="x" />, но лично я предпочитаю конфигурации XML, потому что, если вы хотите изменить размер пула потоков вы только редактировать значения XML и перезагрузка ваше приложение, а не перекомпилировать и переделать все это.

Обязательно поменяйте x и y на соответствующие значения. Это будет зависеть от того, сколько одновременных пользователей вы можете иметь в своей системе.

Вы также должны убедиться, что ваш класс обнаруживаемым в контексте Spring, и что этот метод реализует интерфейс, так что Spring может генерировать прокси-сервер его на самом деле вызывать асинхронно, как на примере ниже

public interface AsyncService { 
    public void checkDatabase(); 
} 

@Service 
public class AsyncServiceImpl implements AsyncService { 
    @Override 
    @Async 
    public void checkDatabase(){ 
     //Do your database check here. 
    } 
} 

Вам также необходимо убедиться, что пакет, в котором находится ваша служба, находится весной, дважды проверьте значение <context:component-scan>.

Счастливые асинхронные выполнения.

2

Вы должны написать

@EnableScheduling

в главном классе Заявке и класс DBPoller должен быть Компонент Spring Framework.

Таким образом, вы должны добавить аннотации @Component (или @Service) к Главе DBPoller класса

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