Весна с кварцем

Я создал кварцевое приложение, используя spring 3.1. Я создал один xml файл Spring-Quartz.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


<bean id="runMeTask" class="com.grit.quartz.RunMeTask" />

<!-- Spring Quartz -->
<bean name="runMeJob" class="org.springframework.scheduling.quartz.JobDetailBean">

    <property name="jobClass" value="com.grit.quartz.RunMeJob" />

    <property name="jobDataAsMap">
        <map>
            <entry key="runMeTask" value-ref="runMeTask" />
        </map>
    </property>

</bean>

<!-- <bean id="runMeJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject" ref="runMeTask" /> <property name="targetMethod" 
    value="printMe" /> </bean> -->

<!-- Simple Trigger, run every 5 seconds -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

    <property name="jobDetail" ref="runMeJob" />
    <property name="repeatInterval" value="5000" />
    <property name="startDelay" value="1000" />

</bean>

<!-- Cron Trigger, run every 5 seconds -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

    <property name="jobDetail" ref="runMeJob" />
    <property name="cronExpression" value="0/1 * * * * ?" />

</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobDetails">
        <list>
            <ref bean="runMeJob" />
        </list>
    </property>

    <property name="triggers">
        <list>
            <ref bean="simpleTrigger" />
        </list>
    </property>

    <property name="quartzProperties">
    <props>
        <prop key="org.quartz.threadPool.threadCount">15</prop>
    </props>
</property>   

</bean>

When i am executing this file as standalone application using

new ClassPathXmlApplicationContext("Spring-Quartz.xml");

работает нормально.

Но мне нужно запустить это приложение, когда я собираюсь развернуть это приложение в tomcat.

Для этого я создал ServletContextListener и в контексте инициализировал вызов new ClassPathXmlApplicationContext("Spring-Quartz.xml");

Он работает нормально, но после того, как я выключил свой кот, расписание все еще работает. Итак, как я могу отключить расписание или есть ли другой способ инициализировать расписание ??


person Hunter    schedule 16.07.2013    source источник


Ответы (3)


В методе Destroy вызовите метод < метод href="http://quartz-scheduler.org/documentation/quartz-2.x/cookbook/ShutdownScheduler" rel="nofollow">scheduler.shutdown().

person Shailesh Pratapwar    schedule 17.07.2013
comment
Это автоматически вызывается контейнером Spring, когда приложение упорядоченно завершает работу (на самом деле вызывается SchedulerFactoryBean.destroy, который вызывает scheduler.shutdown; я предполагаю, что OP внезапно отключает Tomcat, т.е. использует kill -9). - person yair; 17.07.2013
comment
может случиться так, что при вызове выключения есть определенные задания, которые запущены, но еще не завершены. И из-за этого поток планировщика ожидает их завершения. Передача аргумента false в scheduler.shutdown может решить эту проблему, если она есть здесь. - person Shailesh Pratapwar; 17.07.2013
comment
тогда все же OP не должен явно вызывать scheduler.shutdown(true). Скорее используйте свойство <property name="waitForJobsToCompleteOnShutdown" value="true"/> в конфигурации компонента. Кроме того, я ожидаю, что OP скажет, что приложение вообще не закрылось... - person yair; 17.07.2013

Добавьте к <props> следующее:

<prop key="org.quartz.threadPool.makeThreadsDaemons">true</prop>

Это должно заставить потоки кварца завершаться при завершении работы приложения.

person yair    schedule 17.07.2013

Quartz Job Scheduler – это открытый исходный код для автоматизации заданий путем планирования интервала времени. Так что задание может быть выполнено при срабатывании триггера. Слушатели триггеров срабатывают в определенное время.

QuartzInitializerListener with Spring
При изменении записей в DBS триггер для поиска и отправки sms Класс Dto, который содержит данные БД

public class EmpDto {
    private Integer id;
    private String name;
    private Integer age;
    private Integer salary;
    private String address;

    private  List<EmpDto> empList;.....

Чтобы запланировать выполнение задания/задачи на определенную дату и время. компонент/класс должен реализовать интерфейс JOB и @override execute(). чтобы код метода ececute() выполнялся планировщиком при срабатывании триггера.

public class Quartz_JOB implements Job{

    private EmpDao edao; // configure in applicationContex.xml

    public EmpDao getEdao() {   return edao;    }
    public void setEdao(EmpDao edao) {  this.edao = edao;   }
    public static Integer size;

    public void execute(JobExecutionContext context) throws JobExecutionException {
        Date time = context.getFireTime();
        Date next_trigger_time =context.getNextFireTime();
        System.out.println("### Current Trigget Time : "+time+"### Next Trigger Time : "+next_trigger_time);

        JobKey job_key = context.getJobDetail().getKey();
        JobDataMap dataMap = context.getMergedJobDataMap(); // Get all the keys from Listener.
        System.out.println("Instance " + job_key + " of DumbJob says: " + jobSays + ", and val is: " + record_Size);
        System.out.println("Trigger Data : "+curr_Record_Size);

        System.out.println("#######Empdao : "+edao);

    }
    String jobSays;
    int record_Size;
    int curr_Record_Size;

    public int getCurr_Record_Size() {  return curr_Record_Size;    }
    public void setCurr_Record_Size(int curr_Record_Size) {
        this.curr_Record_Size = curr_Record_Size;
    }   
}

web.xml

<listener>
    <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
</listener>

Веб-прослушиватель

@WebListener
public class QuartzListener extends QuartzInitializerListener {
     Scheduler scheduler = null;
     Integer size = null;

     @Override
     public void contextInitialized(ServletContextEvent servletContext) {
          System.out.println("Context Initialized");

          try {
      // JobDetails used to create instances of a class which Implement <<job>>
      // <<JobBuilder>> used to define/build instances of <<JobDetails>>. Which define istances of job.
             JobDetail job1 = JobBuilder
                                .newJob(Quartz_JOB.class)
                                .withIdentity("Job_ID", "Group1")
                                .usingJobData("jobSays", "Hello World!")
                                .usingJobData("recird_Size", 3)
                                .build();

      // <<Trigger>> a component that defines the scheduled 'Time Interval'. So that the given job to execute.
      // << TriggerBuilder>> used to create Trigger Instance.
             Trigger trigger = TriggerBuilder
                                .newTrigger()
                                .withIdentity("Trigger_ID", "Group1")
                                .forJob("Job_ID", "Group1")
                                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                                .usingJobData("curr_Record_Size", edto.getEmpList().size())
                                .build();



            // Setup the Job and Trigger with Scheduler & schedule jobs
            scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.start();
            scheduler.scheduleJob(job1, trigger);                   
         }catch (SchedulerException e) {
              e.printStackTrace();
         }
      }
      @Override
      public void contextDestroyed(ServletContextEvent servletContext) {
          System.out.println("Context Destroyed");
           try {
              scheduler.shutdown();
              System.out.println("Quartz stoped");
           }catch (SchedulerException e) {
                 e.printStackTrace();
           }
      }
}

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

Чтобы создать выражение кукурузы

person Yash    schedule 07.07.2015