Предисловие
Для обеспечения высокой доступности и высокой параллелистики приложений обычно развертываются несколько узлов; Для задач срока, если каждый узел выполняет свои собственные задачи времени, он потребляет системные ресурсы, с одной стороны.
С другой стороны, некоторые задачи выполняются несколько раз, что может вызвать проблемы с логикой приложений, поэтому для координации каждого узла необходима распределенная система планирования.
Весна интегрирует кварц
Кварц - это зрелая система планирования задач. Весна совместима с кварцем для легкой разработки. Посмотрим, как это интегрировать:
1. Предоставление файла зависимости
<DepeCtiendions> <Dependency> <groupId> org.springframework </GroupId> <strifactid> Spring-Core </artifactid> <sersive> 4.3.5.release </version> </resemency> <Dependency> <groupid> org.springframework </GroupD> <ratifactid> spring-context-support </artifactId> 4.3.1. </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.5.RELEASE</version> </depervice> <dependency> <groupid> org.quartz-scheduler </groupid> <artifactid> Quartz </artifactid> <sersive> 2.2.3 </version> </dependency> <dehyedency> <groupid> mysql </GroupId> <artifactid> mysql-connector-java </artifactid> <seriad> 1.1.1.1.1.1.1.1.1.1.1.1.1.1.29. </зависимости>
Основными из них являются библиотеки, связанные с пружиной, библиотеки кварца и библиотеки драйверов MySQL. Примечание: для распределенного планирования требуется использование базы данных, и MySQL выбирается здесь;
2. Настройте задание
Есть два способа настройки заданий, а именно: MethodInvokingJobdetailFactorybean и JobDetailFactoryBean
2.1methodinvokingjobdetailfactorybean
Если вы хотите вызвать метод конкретного боба, конкретная конфигурация заключается в следующем:
<bean id = "firsttask"> <name = "name =" targetObject "ref =" firstService " /> <name =" targetMethod "value =" service " /> < /bea>
2.2jobdetailfactorybean
Этот метод более гибкий и может установить проходящие параметры следующим образом:
<bean id = "Firsttask"> <name = "jobclass" value = "zh.maven.squartz.task.firsttask"/> <name = "jobdatamap"> <map> <intpirt key = "firstservice" value-ref = "firstservice"/> </map> </properate> </bean>
Класс задач, определенный JobClass, наследует Quartzjobbean и реализует метод Executeinternal; JobDatamap используется для передачи данных на работу
3. Настройте триггеры, используемые для планирования
Также предоставлены два типа триггеров: SimpliggerFactorybean и CrontriggerFactoryBean
Сосредоточьтесь на Crontriggerfactorybean, этот тип более гибкий, следующим образом:
<bean id = "firstcrontrigger"> <name = "jobdetail" ref = "firsttask" /> <name = "cronexpression" value = "0/5 * *? *" /" /> < /bean>
JobDetail указывает задание, настроенное на шаге 2, а CronexPression настроена на выполнение задания каждые 5 секунд;
4. Настройка планировщика планировщика Quartz Spaduler
Есть также два метода: методы памяти Ramjobstore и базы данных
4.1 Память Рамджобстор
Информация, связанная с работой, хранится в памяти, и каждый узел хранит свои собственные, изолирует друг друга и настраивается следующим образом:
<Bean> <name = "triggers"> <sist> <ref bean = "FirstCrontrigger"/> </list> </property> </bean>
4.2 Метод базы данных
Соответствующая информация задания хранится в базе данных. Все узлы делятся базой данных. Каждый узел связывается через базу данных, чтобы убедиться, что задание будет выполнено только на одном узле одновременно.
Если узел не удается, задание будет назначено другим узлам для выполнения. Конкретная конфигурация заключается в следующем:
<bean id="dataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/quartz" /> <property name="user" value="root" /> <property name="password" value="root" /> </bean> <bean> <name = "name =" dataSource "ref =" dataSource "/> <name =" configlocation "value =" classPath: quartz.properties "/> <name =" triggers "> <Sist> <ref bean =" FirstCrontrigger "/> </list> </properate> </bean> <ref bean ="
DataSource используется для настройки источников данных и информации, связанной с таблицей данных. Вы можете скачать пакет GZ с официального сайта. Файл SQL находится под пути: DOCS/DBTABLES, который предоставляет файл SQL для основной базы данных;
Файл Quartz.Properties, настроенный в конфигурации, находится в пакете quartz.jar Quartz.jar Quartz
org.quartz.jobstore.class: org.quartz.simpl.ramjobstore
Здесь вам нужно скопировать Quartz.properties и внести некоторые изменения. Конкретные модификации следующие:
org.quartz.scheduler.instanceid: autoorg.quartz.jobstore.class: org.quartz.impl.jdbcjobstore.jobstoretxorg.quartz.jobstore.iscluster: trueorg.quartz.jobstore.clustercheckininterval: 1000
5. Связанные категории
Public Class FirstTask расширяет Quartzjobbean {Private FirstService FirstService; @Override Protected void executeInternal (JobExeCutionContext Context) THRES JOBEXECUTIONEXCEPTE {Fervervice.service (); } public void setFirstService (FirstService FirstService) {this.FirstService = FirstService; }}FirstTask наследует Quartzjobbean, реализует метод Executeinternal и вызовы FirstService
Public Class FirstService реализует Serializable {Private Static Long Long SerialVersionUID = 1L; public void service () {System.out.println (new SimpleDateFormat ("yyyMmdd HH: MM: SS"). Format (new Date ()) + "--- Start FirstService"); try {thread.sleep (2000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println (new SimpleDateFormat ("yyyMmdd HH: MM: SS"). Format (new Date ()) + "--- End FirstService"); }}FirstService должно обеспечить интерфейс сериализации, потому что его необходимо сохранить в базе данных;
public class app {public static void main (string [] args) {AbstractApplicationContext context = new ClassPathxMlapplicationContext ("Quartz.xml"); }}Основной класс используется для загрузки файла конфигурации кварца;
Тест распределенного расписания
1. Запустите приложение дважды одновременно и наблюдайте за журналом:
20180405 14:48:10 --- Start FirstService
20180405 14:48:12 ---- Конец FirstService
20180405 14:48:15 --- Start FirstService
20180405 14:48:17 ---- Конец FirstService
Среди них A1 имеет выходной сигнал, но A2 нет; Когда A1 остановлен, A2 имеет выходной сигнал;
2. Добавьте новые задания и создайте новые: SecondTask и Secondservice соответственно. Добавьте соответствующие файлы конфигурации одновременно. Запустите приложение дважды и наблюдайте за журналом:
Журнал A1 выглядит следующим образом:
20180405 15:03:15 --- Start FirstService
20180405 15:03:15 --- Начало секунд
20180405 15:03:17 ---- Конец FirstService
20180405 15:03:17 --- Конец секунды
20180405 15:03:20-СТАЧНАЯ FirstService
20180405 15:03:22 ---- Конец FirstService
20180405 15:03:25 --- Start FirstService
20180405 15:03:27 ---- Конец FirstService
Журнал A2 выглядит следующим образом:
20180405 15:03:20-Начальный секунд
20180405 15:03:22 --- Конец секунды
20180405 15:03:25 --- Начало секунд
20180405 15:03:27 --- Конец секунды
Можно обнаружить, что как A1, так и A2 имеют задачи выполнения, но одна и та же задача будет выполнена только на одном узле одновременно, и ее можно назначить на другие узлы после завершения выполнения;
3. Если время интервала меньше времени выполнения задачи, например, здесь изменяется на сон (6000)
Журнал A1 выглядит следующим образом:
20180405 15:14:40 --- Start FirstService
20180405 15:14:45 --- Start FirstService
20180405 15:14:46 ---- Конец FirstService
20180405 15:14:50 --- Start FirstService
20180405 15:14:50-Начальный секунд
20180405 15:14:51 --- End FirstService
Журнал A2 выглядит следующим образом:
20180405 15:14:40 --- Начало секунд
20180405 15:14:45 --- Начало секунд
20180405 15:14:46 --- Конец секунды
20180405 15:14:51 --- Конец секунды
Интервал составляет 5 секунд, в то время как выполнение задачи занимает 6 секунд. Наблюдая за журналом, вы можете обнаружить, что задача еще не закончилась, и началась новая задача. Эта ситуация может вызвать логические проблемы в приложении, что на самом деле является вопросом о том, может ли задача поддержать сериал;
4. @disallowconcurrentexecution Annotation обеспечивает сериализацию задач
Добавить аннотацию @disallowncurrentexecution на первой и второй даче соответственно, и результаты журнала заключаются в следующем:
Журнал A1 выглядит следующим образом:
20180405 15:32:45 --- Start FirstService
20180405 15:32:51 --- End FirstService
20180405 15:32:51 --- Start FirstService
20180405 15:32:51 --- Начало секунд
20180405 15:32:57 ---- Конец FirstService
20180405 15:32:57 --- Конец секунды
20180405 15:32:57 --- Start FirstService
20180405 15:32:57 --- Начало секунд
Журнал A2 выглядит следующим образом:
20180405 15:32:45 --- Начало секунд
20180405 15:32:51 --- Конец секунды
Наблюдая за журналами, вы можете обнаружить, что задача запустит новую задачу только после конца и реализует сериализацию задачи;
Суммировать
Эта статья направлена на то, чтобы иметь интуитивное понимание распределения расписания Spring+Quartz и решить проблему с помощью фактического использования. Конечно, может быть много вопросов, таких как запланировано, что произойдет, если база данных будет подвешена и т. Д., И необходимо более глубокое понимание.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.