


Comment utiliser Quartz pour implémenter des tâches planifiées Java à haute disponibilité ?
Guide d'utilisation des tâches planifiées
Si vous souhaitez effectuer des tâches planifiées, avez des exigences de haute disponibilité
ou souhaitez simplement démarrer rapidement
et démarrer facilement, alors vous ont raison de le choisir. 高可用
方面的需求,或者仅仅想入门快
,上手简单,那么选用它准没错。
定时任务模块是对Quartz框架进一步封装,使用更加简洁。
1、引入依赖
<dependency> <groupId>xin.altitude.cms</groupId> <artifactId>ucode-cms-quartz</artifactId> <version>1.5.4.1</version> </dependency>
2、快速上手
实现org.quartz.Job
接口;使用注解CronExp
添加任务的调度策略;使用注解Component
将任务注入容器中。
启动项目,定时任务便处于监听与运行中。
@Component @DisallowConcurrentExecution @CronExp(cron = "0/5 * * * * ?") public class DemoJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("任务1:" + LocalDateTime.now()); } }
3、手动触发定时任务
定时任务除了以既有频率周期性运行外,还有通过接口手动被触发的能力。
调用如下接口,可手动触发任务ID编号为jobId
的任务。
http://localhost:8080/cms-api/quartz/job/{jobId}
如果有手动触发定时任务的需求,则需要任务ID唯一并
且已知
,因此需要在编写定时任务时手动指定。
@CronExp(id = 1, cron = "0/5 * * * * ?")
通过注解CronExp
的id属性可指定任务ID,不显示指定则使用随机ID,不满足已知的条件,因此无法手动触发。
4、带参数任务
尽管大多数任务不需要注入参数,但仍有少量的场景需要向定时任务注入参数。
public void execute(JobExecutionContext context) { /* 如果在调用任务时传入了参数,则能够从Map中获取 */ Map<String, Object> dataMap = context.getMergedJobDataMap(); /* 比如从Map中获取一个键值对,一般来说参数均为基本数据类型 */ Object key = dataMap.get("key"); System.out.println("任务2:" + LocalDateTime.now() + ": " + key); }
在编写定时任务时,可从JobExecutionContext
对象中解析一个Map,从而完成参数的注入。
http://localhost:8080/cms-api/quartz/job/1?key=a
上述http调用的含义是手动触发任务ID为【1】的任务,并且向其传递参数为【key】值为【a】的参数。
5、任务并发
本框架不支持任务并发,换句话说并发对定时任务不利,因此需要手动禁止。
需要注意的是Quartz
的并发是指当任务执行耗时超过任务调度周期时,上一个任务未执行完,新任务是否执行。
一般来说需要显示禁止并发,在任务类上添加注解DisallowConcurrentExecution
spring: quartz: properties: org.quartz.jobStore.isClustered: true org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource: qzDS org.quartz.dataSource.qzDS.driver: com.mysql.cj.jdbc.Driver org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/quartz-demo org.quartz.dataSource.qzDS.user: root org.quartz.dataSource.qzDS.password: 123456
org.quartz.Job
; utilisez l'annotation CronExp
pour ajouter la stratégie de planification des tâches ; utilisez l'annotation Component
pour injecter des tâches dans le conteneur. Démarrez le projet et les tâches planifiées seront surveillées et exécutées. rrreeeEn plus de s'exécuter périodiquement à la fréquence existante, les tâches planifiées ont également la possibilité d'être déclenchées manuellement via l'interface. 🎜🎜Appelez l'interface suivante pour déclencher manuellement la tâche avec le numéro d'identification de la tâche3. Déclenchez manuellement les tâches planifiées
jobId
. 🎜🎜http://localhost:8080/cms-api/quartz/job/{jobId}
🎜🎜S'il est nécessaire de déclencher manuellement une tâche planifiée, l'ID de la tâche doit être unique et
code> et est connu
, il doit donc être spécifié manuellement lors de l'écriture d'une tâche planifiée. 🎜rrreee🎜Vous pouvez spécifier l'ID de la tâche en annotant l'attribut id de CronExp
Si vous ne le spécifiez pas explicitement, un ID aléatoire sera utilisé. Il ne remplit pas les conditions connues, il ne peut donc pas. être déclenché manuellement. 🎜🎜4. Tâches avec paramètres🎜🎜Bien que la plupart des tâches n'aient pas besoin d'injecter de paramètres, il existe encore un petit nombre de scénarios qui nécessitent l'injection de paramètres dans des tâches planifiées. 🎜rrreee🎜Lors de l'écriture d'une tâche planifiée, vous pouvez analyser une carte à partir de l'objet JobExecutionContext
pour terminer l'injection des paramètres. 🎜rrreee🎜La signification de l'appel http ci-dessus est de déclencher manuellement la tâche avec l'ID de tâche [1], et de lui transmettre le paramètre [key] avec la valeur [a]. 🎜🎜5. Concurrence des tâches🎜🎜Ce framework ne prend pas en charge la simultanéité des tâches. En d'autres termes, la simultanéité n'est pas bonne pour les tâches planifiées, elle doit donc être désactivée manuellement. 🎜🎜Il convient de noter que la concurrence de Quartz
fait référence au fait de savoir si la nouvelle tâche sera exécutée lorsque le temps d'exécution de la tâche dépasse le cycle de planification des tâches et que la tâche précédente n'a pas été exécutée. 🎜🎜 De manière générale, il est nécessaire d'afficher l'interdiction de concurrence. Ajoutez l'annotation DisallowConcurrentExecution
à la classe de tâches pour désactiver la concurrence des tâches. 🎜🎜6. Persistance🎜🎜Si la tâche planifiée a des exigences de haute disponibilité, alors la tâche doit être persistante. Une fois les données des tâches planifiées conservées dans la base de données, plusieurs applications peuvent être ouvertes. Après un déploiement persistant sur plusieurs nœuds de tâches planifiées, une défaillance d'un seul nœud dans le cluster n'affectera pas l'exécution des tâches planifiées. 🎜🎜Persistance des tâches chronométrées, il vous suffit de modifier la configuration du fichier yml pour atteindre l'objectif, sans modifier le code. De manière générale, Mysql est utilisé comme conteneur persistant. 🎜rrreee🎜À l'exception de la modification des cinq paramètres d'hôte, de port, de nom de base de données, de nom d'utilisateur et de mot de passe, utilisez les valeurs par défaut pour les autres paramètres. 🎜🎜🎜Après avoir configuré la connexion à la base de données, utilisez le script SQL et faites attention à l'initialisation de la base de données🎜🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.
