Одна из целей
TimeMachine Scheduler — сделать использование POJO максимально удобным, чтобы мы могли легко интегрироваться в любой контейнер IoC. Я подготовил демонстрацию, которая покажет вам, как интегрировать TimeMachine с
приложениями на основе Spring .
В этой статье мы сконцентрируемся в основном на части конфигурации Spring xml, поэтому, если вам не хочется детально изучать исходный код демонстрационного проекта , просто возьмите двоичный пакет timemachine-spring-demo.zip и следуйте инструкциям. ,
Представляем крошечный Spring Server
Если у вас еще нет проекта Spring, взгляните на мой маленький сервер Spring. Он может загрузить любой XML-файл конфигурации Spring, а затем сидеть и ждать окончания работы CTRL + C. Разархивируйте демо-версию и попробуйте вот так.
$ cd timemachine-spring-demo $ bin/run-spring config/hello-spring.xml
Вы должны увидеть «Hello World!» сообщение распечатано. Нажмите CTRL + C, чтобы закончить. XML просто объявляет простой боб HelloService, как это.
<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="helloService" class="timemachine.spring.HelloService" init-method="run"> <property name="name" value="World"></property> </bean> </beans>
Это ваш типичный файл декларации Spring. С этим крошечным сервером Spring вы можете быстро поэкспериментировать с любыми POJO, подключенными любым образом, и запустить их в действие.
Настройка компонентов TimeMachine Scheduler
В коде Java вы можете легко создать экземпляр планировщика TimeMachine следующим образом:
SchedulerFactory schedulerFactory = new SchedulerFactory("config/scheduler.properties"); Scheduler scheduler = schedulerFactory.createScheduler(); scheduler.start(); // Then we would also need to call scheduler.destroy() before we exit the Java program. (eg: in shutdownHook)
Вы можете легко перевести это в конфигурацию Spring xml, как в config / timemachine-pojo-spring.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="schedulerFactory" class="timemachine.scheduler.SchedulerFactory"> <constructor-arg value="config/scheduler.properties"></constructor-arg> </bean> <bean id="scheduler" class="timemachine.scheduler.Scheduler" factory-bean="schedulerFactory" factory-method="createScheduler" init-method="start" destroy-method="destroy"> </bean> </beans>
Преимущество использования Spring xml заключается в том, что о жизненных циклах планировщика будет автоматически позаботиться без установки какого-либо обработчика отключения. Запуск выше должен дать вам простой запущенный планировщик, а нажатие CTRL + C должно корректно завершиться.
Идем дальше с пользовательским SchedulerFactoryBean
Теперь выше не так много радости с использованием Spring, так как вы все равно настроите планировщик через config / scheduler.properties. Вы, конечно, можете загружать рабочие места и добавлять там настраиваемые сервисы. Но если мы собираемся использовать Spring, мы могли бы в полной мере использовать его для создания определения задания и расписания в конфигурации xml! Чтобы сделать это, я создал простой timemachine.scheduler.spring.SchedulerFactoryBean в своем демонстрационном проекте, и вы можете попробовать его так:
<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="scheduler" class="timemachine.scheduler.spring.SchedulerFactoryBean"> <property name="configPropsUrl" value="config/scheduler.properties"></property> <property name="autoStart" value="true"></property> <property name="autoAddJobDef" value="true"></property> </bean> <bean id="jobDef01" class="timemachine.scheduler.JobDef"> <property name="jobTaskClassName" value="timemachine.scheduler.jobtask.ScriptingJobTask"></property> <property name="props"> <map> <entry key="scriptEngineName" value="Groovy"></entry> <entry key="scriptText" value="println('Hello World.')"></entry> </map> </property> <property name="schedules"> <list> <bean class="timemachine.scheduler.schedule.CronSchedule"> <property name="expression" value="0/3 * * * * ?"></property> </bean> </list> </property> </bean> </beans>
Выше будет создан не только планировщик, но и автоматическое управление жизненными циклами для вас без явного объявления. Заводской компонент также автоматически обнаруживает любые типы компонентов JobDef и Schedule и добавляет их в экземпляр планировщика. Это сделает конфигурацию вашего планировщика полностью в Spring xml, и он хорошо интегрирован.
В config / timemachine-spring.xml вы можете попробовать другой подобный пример. Он будет вызывать внешний скрипт Groovy вместо встроенного текста.
Пройдя лишнюю милю, выставляя TimeMachine Scheduler через JMX
TimeMachine не поддерживает какие-либо инструментарий JMX, однако при работе с Spring вы можете легко представить любой интерфейс Java для локальной серверной платформы MBean, используя Spring MBeanExporter. Например, в config / timemachine-jmx-spring.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="scheduler" class="timemachine.scheduler.spring.SchedulerFactoryBean"> <property name="configPropsUrl" value="config/scheduler.properties"/> </bean> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="assembler"> <bean class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler"> <property name="managedInterfaces"> <list> <value>timemachine.scheduler.Scheduler</value> </list> </property> </bean> </property> <property name="beans"> <map> <entry key="timemachine.scheduler:name=Scheduler" value-ref="scheduler"/> </map> </property> </bean> </beans>
Выше запустится пустой планировщик и откроет интерфейс timemachine.scheduler.Scheduler для локального сервера JMX. Вы можете использовать $ JAVA_HOME / bin / jconsole для подключения и увидите все методы автоматически выставленные. Есть несколько методов, которые содержат пользовательские объекты Java, которые экспортер не сможет конвертировать должным образом, но, по крайней мере, вы получите все доступные вам жизненные циклы и несколько простых методов получения.