Библиотека планирования JSF 2 Quartz

#jsf #jsf-2 #quartz-scheduler

#jsf #jsf-2 #quartz-планировщик

Вопрос:

У меня есть веб-приложение, использующее JSF 2. В этом приложении я использую библиотеку построения графиков, которая получает данные из XML-файла, приложение обновляет XML-файл, когда кто-то обращается к сайту, из-за действия jsf 2. Теперь я хочу внедрить библиотеку Quartz в библиотеку планирования с открытым исходным кодом, чтобы обновить XML-файл и не полагаться на действия пользователей, но я понятия не имею, как вызвать действие из Quartz с помощью JSF 2.

Заранее спасибо, ребята.

Ответ №1:

Вообще говоря, вы должны реализовать свою логику планирования, определить, когда она будет выполняться, и инициализировать запланированные задания при запуске сервера приложений.

Реализация запланированной логики

Ваш запланированный класс должен реализовать org.quartz.Job интерфейс и переопределить его execute(), который содержит логику вашего запланированного задания. В вашем случае это метод обновления XML-файла. Вы должны сделать так, чтобы этот метод не зависел от JSF, чтобы его можно было вызывать вне JSF.

 public class MyScheduledJob implements Job {

   public void execute(JobExecutionContext context) throws JobExecutionException {
          updateXML();
   }
}
 

Инициализируйте и запустите Quartz

Quartz предоставляет ServletContextListener вызываемый QuartzInitializerListener, который позволяет инициализировать и запускать Quartz при запуске сервера приложений .

Добавьте этот прослушиватель в свой web.xml

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

По умолчанию он будет искать файл, вызываемый quartz.properties в пути к классу, для инициализации Quartz . Вы можете обратиться к этому для получения дополнительной информации о настраиваемых параметрах, доступных в quartz.properties

Определите, какое задание будет выполняться в какое время

Вы можете определить его в XML-файле (его определение схемы можно найти здесь ) и настроить XMLSchedulingDataProcessorPlugin quartz.properties для загрузки этого XML при инициализации Quartz.

Например, в quartz.properties

org.quartz.plugin.jobInitializer.class =org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin org.quartz.plugin.jobInitializer.Имена файлов = quartz-config.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = истина

Затем в quartz-config.xml

 <?xml version="1.0" encoding="UTF-8"?>

    <job-scheduling-data
        xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
        version="1.8">

        <schedule>
            <job>
                <name>MyScheduledJob</name>
                <group>MyScheduledGroup</group>
                <description>Job to update XML </description>
                <job-class>com.xxxx.xxxx.xxxx.MyScheduledJob </job-class>
            </job>

            <trigger>
                    <cron>
                            <name>midNightTrigger</name>
                            <job-name>MyScheduledJob</job-name>
                            <job-group>MyScheduledGroup</job-group>
                            <!-- It will run every night at 3:30 am -->
                            <cron-expression>0 30 3 * * ?</cron-expression>  
                    </cron>
              </trigger>
        </schedule>
    </job-scheduling-data>
 

Все вышесказанное относится к Quartz последней версии 2.1 . Для получения дополнительной информации вы можете ознакомиться с примерами кодов и руководствами Quartz.

Ответ №2:

Если вы действительно хотите вызвать действие JSF из запланированного задания, методу задания execute() потребуется включить код, который отправляет HTTP-запрос к действию JSF. Вероятно, вы захотите использовать библиотеку кода, такую как Apache HttpClient или HTTP Unit, если класс URLConnection java не соответствует вашим потребностям.