Améliorations sur l’ordonnanceur Apache Karaf

Améliorations sur l’ordonnanceur Apache Karaf

Apache Karaf™ dispose d’un ordonnanceur permettant d’exécuter périodiquement des actions. Il est alimenté par Quartz et offre plusieurs fonctions pratiques.

  • Vous pouvez facilement installer l’ordonnanceur avec la fonction scheduler :karaf@root> feature:install scheduler. Une fois installé, vous disposez de nouvelles commandes : scheduler:schedule, scheduler:list, etc.
  • L’ordonnanceur Karaf fournit également un modèle de tableau blanc pour la recherche de Runnable ou Job. Il utilise les propriétés de service comme configuration de l’ordonnancement.
yupiik-apache-karaf

C’est ce que Karaf Decanter utilise pour le collecteur interrogé, comme le collecteur JMX par exemple : l’ordonnanceur Karaf exécute la méthode run() du collecteur JMX chaque minute par défaut. Vous pouvez « reprogrammer » un travail à l’aide de la commande scheduler:reschedule.

Adaptation de l’article :  « Improvements on the Apache Karaf scheduler  » du blog Nanthrax  écrit par Jean-baptiste Onofré (Technical Advisor)

Les prochaines améliorations de l'ordonnanceur dans Apache Karaf (version 4.2.3)

Nouvelles commandes

En plus du script, la possibilité de planifier l’exécution des commandes est disponible.

La commande scheduler:schedule précédente a été renommée scheduler:schedule-script (vous pouvez créer un alias dans etc/shell.init.script pour une compatibilité ascendante).

Une nouvelle commande a été introduite : scheduler:schedule-command. Cette commande vous permet de planifier l’exécution d’une commande shell

Par exemple, vous pouvez programmer l’exécution de la commande toutes les 30 secondes, 5 fois :

karaf@root()> scheduler:schedule-command --period 30 --times 5 la

Prise en charge du stockage avec JDBC JobStore

Une correction/amélioration importante a été apportée. L’équipe d’Apache Karaf a introduit un nouveau SchedulerStorage pour pouvoir stocker le travail dans un environnement externe. Le comportement par défaut est totalement transparent : utilisable depuis un stockage Quartz. Nous prendrons l’exemple de Quartz JDBCJobStoreTX.

Préparation de la base de données

Avant d’utiliser le registre des traitements dans l’ordonnanceur, il faut préparer une base de données. Pour illustr

er ce cas, on utilisera une base de données Derby, mais n’importe quelle base de données JDBC est compatible.

Commençons avec Derby Networkserver : derby$ bin/startNetworkServer

En utilisant Derby ij, le serveur Derby est accessible et la création d’une base de données possible :

derby$ bin/ij
ij version 10.14
ij> connect 'jdbc:derby://localhost:1527/scheduler;create=true';

La base de données du scheduler Derby est maintenant créée. Nous devons créer les tables utilisées par le Quartz JobStore. La distribution quartz fournit le script SQL pour créer ces tables. Le script SQL correspondant se trouve dans votre base de données : répertoire $QUARTZ/docs/dbTables. En particulier, nous trouvons tables_derby.sql. On exécute ce script sur notre base de données Derby :

ij> run '/path/to/quartz/docs/dbTables/tables_derby.sql';

La base de données est désormais opérationnelle et utilisable dans l’ordonnanceur Karaf.

Création de la source de données dans Apache Karaf

Pour utiliser notre base de données scheduler dans l’ordonnanceur Karaf, nous créons d’abord une source de données. Nous utilisons donc la fonctionnalité jdbc dans Karaf :

karaf@root()> feature:install jdbc

Ensuite, nous installons le fournisseur JDBC derbyclient :

karaf@root> feature:install pax-jdbc-derbyclient

Comme nous utiliserons DataSource via un nom JNDI dans la configuration Karaf Scheduler Quartz, nous installons également la fonctionnalité jndi :

karaf@root()> feature:install jndi

Nous pouvons maintenant créer la source de données directement en utilisant la commande jdbc:ds-create :

karaf@root()> jdbc:ds-create -dn derbyclient -url jdbc:derby://localhost:1527/scheduler scheduler

Notre source de données est prête et disponible avec un nom JNDI :

karaf@root()> jdbc:ds-list 

Name      │ Service Id │ Product      │ Version               │ URL                                   │ Status
──────────┼────────────┼──────────────┼───────────────────────┼───────────────────────────────────────┼───────
scheduler │ 91         │ Apache Derby │ 10.14.2.0 - (1828579) │ jdbc:derby://localhost:1527/scheduler │ OK
karaf@root()> jndi:names
JNDI Name              │ Class Name
───────────────────────┼───────────────────────────────────────────────
osgi:service/scheduler │ org.ops4j.pax.jdbc.impl.DriverDataSource
osgi:service/jndi      │ org.apache.karaf.jndi.internal.JndiServiceImpl

Utilisation de la source de données dans l'ordonnanceur Karaf

Nous pouvons maintenant installer la fonction d’ordonnanceur :

karaf@root()> feature:install scheduler

Vous pouvez maintenant configurer l’ordonnanceur Karaf pour utiliser un JDBC référentiel des traitements avec notre source de données. Pour cela, il faut éditer : le fichier de configuration etc/org.apache.karaf.scheduler.cfg

################################################################################
#
#    Licensed to the Apache Software Foundation (ASF) under one or more
#    contributor license agreements.  See the NOTICE file distributed with
#    this work for additional information regarding copyright ownership.
#    The ASF licenses this file to You under the Apache License, Version 2.0
#    (the "License"); you may not use this file except in compliance with
#    the License.  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#
################################################################################

#============================================================================
# Configure Karaf Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName=Karaf
org.quartz.scheduler.instanceId=AUTO

#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=30
org.quartz.threadPool.threadPriority=5

#============================================================================
# Configure DataSource
#============================================================================
org.quartz.dataSource.scheduler.jndiURL=osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=scheduler)

#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.dataSource=scheduler
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  • La propriété org.quartz.dataSource.scheduler.jndiURL contient le nom JNDI de notre source de données. Grâce à la fonctionnalité jndi de Karaf, on peut utiliser directement le nom JNDI de osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=scheduler).
  • Ensuite, nous configurons un JDBC job store dans la propriété org.quartz.jobStore.class.
  • La propriété org.quartz.jobStore.dataSource contient le nom de la source de données défini précédemment dans le fichier de configuration.
  • Enfin, Quartz supporte plusieurs dialectes JDBC, selon la base de données. Il est défini par la propriété org.quartz.jobStore.driverDelegateClass. Dans notre cas, comme nous utilisons une base de données Derby, vous utilisez le « générique » : org.quartz.impl.jdbcjobstore.StdJDBCDelegate.

Rien ne change autour de l’utilisation de l’ordonnanceur (vous utilisez les mêmes commandes, le même tableau blanc, ….) mais vous pouvez avoir plusieurs instances de l’ordonnanceur « synchronisées » grâce au magasin partagé. C’est particulièrement intéressant lorsque vous avez un cluster Karaf ou lorsque vos instances Karaf sont exécutées sur le cloud.

Besoin de conseils sur les solutions Apache ?

Vous souhaitez former vos équipes ?

fr_FRFrançais
en_GBEnglish (UK) fr_FRFrançais