2013-03-19 3 views
6

Я создаю нить, которая будет продолжать вытягивать кусок записей из базы данных и помещать их в очередь. Этот поток будет запущен при загрузке сервера. Я хочу, чтобы этот поток был активным все время. Если в базе данных нет записей, я хочу, чтобы она подождала и снова проверила через некоторое время. Я думал об использовании весеннего планировщика заданий, чтобы запланировать это, но не уверен, что это правильно, потому что я хочу, чтобы моя задача запускалась один раз. Каким будет весомый способ реализации этого?Планирование задачи весной/Java

Кроме того, мне нужно иметь пограничную проверку, что если мой поток не работает (из-за каких-либо ошибок или условий исключения), он должен быть повторно создан через некоторое время.

Я могу сделать все это в java, используя методы связи потоков, но просто пытаюсь, если есть что-то доступное в Spring или Java для таких сценариев.

Любые предложения или указатели помогут.

ответ

0

Вы можете попробовать использовать кварцевый планировщик. http://quartz-scheduler.org/ Это позволит вам указать продолжительность времени между выполнением задач. Вы можете установить флаг (boolean), который говорит, если класс раньше выполнялся, чтобы избежать дублирования кода, для которого вы хотите запустить только «первое» время.

0

У весны есть поддержка вне очереди для планирования задач. Here are for the docs для последней версии весны 3.2.x, но проверьте документы для используемой вами версии. Похоже, он использует кварц под капотом для планирования задач.

+0

Я прошел через него, но я не хочу, чтобы моя задача выполнялась через определенное время, но только один раз. Просто нужно обработать сценарий, который, если мои задачи снизятся, как я могу воскресить его. – Ashu

6

Аннотацию @Scheduled можно использовать для запуска заданий. Сначала создайте класс с методом, который аннотируется с помощью @Scheduled.

Класс

public class GitHubJob { 

    @Scheduled(fixedDelay = 604800000) 
    public void perform() { 
     //do Something 
    } 
} 

Затем зарегистрировать этот класс в файлах конфигурации.

весна-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:task="http://www.springframework.org/schema/task" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

<tx:annotation-driven/> 
<task:annotation-driven scheduler="myScheduler"/> 

<task:scheduler id="myScheduler" pool-size="10"/> 
<bean id="gitHubJob" class="org.tothought.spring.jobs.GitHubJob"/> 

</beans> 

Более подробную информацию о планировании визита Spring Docs.

0

Я думаю, что ваше требование - это просто регулярный senario, который поддерживает каркас кварца или весны. но вы хотите создать особый подход к имплементации. мое предложение состоит в том, чтобы держать его простым и глупым. Spring scheudling будет использовать ваш рабочий поток путем объединения, а не запускать его все время.

По статистике легко проверить журнал рабочего класса. если вы хотите просмотреть статистику в веб-консоли, вам необходимо записать журнал регистрации в базу данных. Я уверен, что вы можете сделать это легко обычным способом.

4
@Scheduled(fixedDelay=3600000) 
private void refreshValues() { 
    [...] 
} 

Выполняет задачу один раз в час. Он должен быть недействительным и не принимать никаких аргументов. Если вы используете конфигурацию Java Spring, вам также нужно добавить аннотацию @EnableScheduling к одному из ваших классов @Configuration.

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