Circulation - My Geoconcept

Transcription

Circulation - My Geoconcept
Circulation
1
Circulation
Introduction ..................................................................................................................................... 3
Configuration ................................................................................................................................... 4
Chargement du fichier de configuration ..................................................................................... 4
Principe général simplifié ................................................................................................................. 5
Diagramme d’exemple d’import d’une demande de rendez-vous ........................................................ 6
Mediums ................................................................................................................................. 6
Forward-router ......................................................................................................................... 6
Lecture du diagramme d’exemple ............................................................................................. 7
Retours de traitements ............................................................................................................. 7
Fichier XML correspondant ...................................................................................................... 7
Référence : Format du fichier de configuration .................................................................................. 9
Circulation-config ..................................................................................................................... 9
Référence : Format de retour : schéma "circulation-result" ........................................................ 42
ANNEXE 1- Les Expressions Cron ................................................................................................. 45
Les informations figurant dans le présent document décrivent les fonctions et modes d’utilisation de la
« circulation »- au 1er juin 2011. Elles sont sujettes à révision sans préavis.
Le logiciel décrit dans ce document est diffusé dans le cadre d’un contrat de droit d’utilisation et ne
peut être utilisé, copié ou cédé qu’en conformité avec les stipulations de ce contrat. Toute copie de
l’application Opti-Time sur disque ou autre support à des fins autres que l’usage du programme par
l’acheteur pour ses besoins propres est interdite.
Opti-Time est une marque déposée de GeoConcept SA Les captures écran peuvent varier en fonction
des droits attribués et des options retenues.
2
Introduction
Introduction
Cette partie de la documentation concerne la fonctionnalité nommée « Circulation ». Il s’agit d’un module
qui gère la circulation et l'échange des données entre Opti-Time et l’extérieur. Ses applications sont
multiples et permettent de gérer par exemple :
• Sens extérieur → Opti-Time
L’import de demandes de rendez vous par des messages JMS.
L’import de données de référence par des fichiers placés dans un répertoire.
• Sens Opti-Time → extérieur
La notification d’une modification d’un rendez-vous par JMS.
3
Circulation
Configuration
Le module « Circulation » ne propose pas d’interface utilisateur. La configuration du module se fait par
élaboration d’un fichier « circulation_config.xml ».
Chargement du fichier de configuration
A l’initialisation
Le module démarre lors de la phase d’initialisation d’Opti-Time, après lecture du fichier
« circulation_config.xml ».
Par l’interface d’administration
Il est possible de redémarrer le module avec un autre fichier de circulation en se rendant dans l’interface
d’administration d’Opti-Time.
Note 1 : Le module circulation est arrêté, puis est redémarré avec la nouvelle configuration. Il s’agit d’un
remplacement, pas d’un ajout.
Note 2 : Le fichier d’initialisation circulation_config.xml n’est pas mis à jour. Si vous souhaitez que la
nouvelle configuration remplace l’ancienne lors du prochain redémarrage d’Opti-Time, vous devez le
placer dans le répertoire de configuration du serveur (typiquement placé dans d:\gss\nom_de_société
\config\param\circualtion_config.xml).
4
Principe général simplifié
Principe général simplifié
Voici un schéma expliquant le principe général de fonctionnement du module circulation. Toute la
circulation des données dans le module fonctionne selon ce principe.
Les flèches sur ce schéma représentent le flux de circulation des messages.
Les entités représentées ici sont des objets abstraits, lors de la configuration du module par le fichier
circulation_config.xml, vous allez travailler sur des objets concrets.
Par exemple, parmi les listeners concrets, existent :
• les « AppointmentListener » : écoutent tout ce qui se passe sur les rendez-vous (création, modification,
suppression)
• les « InputMediumListener » : écoutent l’arrivée d’un nouveau message sur un médium (repertoire,
JMS).
Configurer le module Circulation consiste à définir les différents objets intervenant dans la circulation des
données et à les relier entre eux.
5
Circulation
Diagramme d’exemple d’import d’une demande de rendez-vous
Voici un diagramme d’import d’une demande de rendez vous.
Sur ce diagramme, les objets concrets sont représentés en police fine, et les objets abstraits auxquels ils
correspondent sont en gras.
Les IDs donnés aux objets dans le fichier XML sont représentés entre guillemets.
Mediums
Ce diagramme introduit la notion de « médium ». Il en existe deux sortes : les input-mediums, permettant
la réception de messages, et les output-medium, permettant l’envoi de message. Ici on utilise les objets
concrets « jms-input-queue » (permettant la réception de message JMS), et « directory-output-medium »,
permettant l’envoi de message sur un répertoire disque.
Forward-router
On utilise ici un filter-router nommé « forward-router », dont le rôle est simplement de transférer le
message vers un autre « router ». Mais il offre une fonctionnalité supplémentaire : Si le message
transferé n’est pas pris en compte par le router (= le router renvoie une erreur), alors le message est
envoyé vers un autre router : dans notre cas, simple-medium-sender, qui va envoyer le message vers le
medium directory-output-medium.
6
Lecture du diagramme d’exemple
Lecture du diagramme d’exemple
L’objet outside-listener écoute les messages arrivant sur la jms-input-queue. Outside-listener envoie ces
messages vers forward-router, qui lui même les transmet à appointment-request-receiver. Ce dernier est
en bout de chaîne, c’est lui qui va réellement effectuer l’import du rendez-vous. Une fois le message pris
en compte, ce processor renvoie au forward-router le résultat de l’import, c’est à dire une valeur VRAI ou
FAUX, indiquant si le traitement s’est bien passé. Le forward-router, si le traitement s’est mal passé, va
alors transférer à nouveau le message au simple-medium-sender, qui lui va l'écrire sur le directory-inputmedium.
Retours de traitements
Tous les objets entrant en compte dans le traitement d’un message informent leur appelant de la bonne
prise en compte ou non (VRAI ou FAUX) de l'événement. Ce retour a donc lieu dans le sens inverse des
flèches.
Cela permet à l’appelant d’agir en conséquence. Par exemple, ici, si forward-router reçoit FAUX à la
fois de l’appointment-request-receiver puis de simple-medium-sender, alors il renverra FAUX à son
appelant, c’est à dire au listener, qui lui même le renverra au jms-input-queue. Ce dernier ne fera alors
pas d’Acknowledge JMS.
Si forward-router reçoit FAUX de l’appointment-request-receiver, puis VRAI de simple-medium-sender,
alors il renvoie vrai, considérant que le message a d’une façon ou d’une autre été pris en compte.
Certains routers peuvent aussi completer leur répoonse avec des données supplémentaires : le
ResultData.
Fichier XML correspondant
Voici un fichier XML correspondant à notre exemple.
Les parties de XML encadrées sont des references aux ids des objets du fichier. Les flèches montrent les
objets référencés.
<?xml version="1.0" encoding="UTF-8"?>
<circulation-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schemas/circulation-config.xsd">
<circulation-block>
<listeners>
<inside-listeners>
</inside-listeners>
<outside-listeners>
<outside-listener>
<id>myOutsideListener</id>
<input-medium>myJMSQueue</input-medium>
<router>myForwardRouter</router>
<default-unmarshaller>defaultAppointmentUnmarshaller</default-unmarshaller>
</outside-listener>
</outside-listeners>
</listeners>
<routers>
<filter-routers>
7
Circulation
<forward-router>
<id>myForwardRouter</id>
<router>appointmentToGSSRouter</router>
<error-router>senderForAppointmentErrorMessage</error-router>
</forward-router>
</filter-routers>
<processor-routers>
<inside-processors>
<appointment-request-receiver>
<id>appointmentToGSSRouter</id>
</appointment-request-receiver>
</inside-processors>
<outside-processors>
<simple-medium-sender>
<id>senderForAppointmentErrorMessage</id>
<output-medium>mediumSenderForAppointmentErrorMessage</output-medium>
<marshaller>pseudoMarshaller</marshaller>
</simple-medium-sender>
</outside-processors>
</processor-routers>
</routers>
<mediums>
<input-mediums>
<jms-input-queue>
<id>myJMSQueue</id>
<jndi-name>serial://jms/queueGC02ToGSS</jndi-name>
<jms-connection>connectionAppointment</jms-connection>
</jms-input-queue>
</input-mediums>
<output-mediums>
<directory-output-medium>
<id>mediumSenderForAppointmentErrorMessage</id>
<location>c:\temp\gss\messages\appointment-error</location>
<prefix>ERROR</prefix>
<suffix>.xml</suffix>
</directory-output-medium>
</output-mediums>
</mediums>
<transformers>
<unmarshallers>
<by-class-appt-unmarshaller>
<id>defaultAppointmentUnmarshaller</id>
<classname>com.geoconcept.schedule.logic.circulation.impl.PseudoUnmarshaller</classname>
</by-class-appt-unmarshaller>
</unmarshallers>
<marshallers>
<by-class-appt-marshaller>
<id>pseudoMarshaller</id>
<classname>com.geoconcept.schedule.logic.circulation.impl.PseudoMarshaller</classname>
</by-class-appt-marshaller>
</marshallers>
</transformers>
<connections>
<jms-connection>
<id>connectionAppointment</id>
<factory-jndi-name>serial://jms/myQueueConnectionFactory</factory-jndi-name>
<reconnection-delay>10000</reconnection-delay>
</jms-connection>
</connections>
</circulation-block>
</circulation-config>
8
Référence : Format du fichier de configuration
Référence : Format du fichier de configuration
Le format du fichier de configuration XML est spécifié sous la forme d’un schéma XML W3C (XSD) :
« circulation-config.xsd ».
Voici le les premières balises du schéma :
Circulation-config
Cette balise est la racine de tout document circulation-config. Elle contient des circulation-block.
9
Circulation
Circulation-block
Un circulation-block est un ensemble d’objets de circulation décrivant un ou plusieurs flux cohérents, par
exemple : L’import de données de référence, ou la notification de mise à jour de rendez-vous.
Vous êtes libre de découper votre fichier de circulation en plusieurs blocs, ou de tout mettre dans un seul
et même bloc. Le comportement de l’application ne s’en trouvera pas changé.
Note importante : Les objets référencables à l’intérieur d’un block sont les objets de ce blocs, et les objets
des blocs précédents. Il n’est pas possible de référencer les objets des blocs suivants.
L’espace de nommage des objets est global : L’ID d’un objet doit être unique dans l’ensemble du fichier.
Listeners
Cette balise contient tous les listeners d’un bloc : d’abord tous les inside-listeners, ensuite tous les
outside-listeners.
Inside-listeners
Cette balise contient tous les inside-listeners d’un bloc :
Un inside-listener est un objet qui écoute les événements internes à Opti-Time.
Appointment-listeners
Un appointment-listener est un objet capable d'écouter les événements se produisant sur les rendez-vous
dans Opti-Time : Ajout, modification, suppression.
10
Circulation-config
A chaque événement reçu, la donnée envoyée vers le router est un Appointment.
L’appointment-listener informe de tous les évènements de création et mise à jour des rendez vous une
fois que ces évènements sont validés. Ces événements peuvent être filtrés en fonction d’une chaîne de
transition d'état qui est une liste de filtres pour les événements correspondant à un changement de statut
particulier. Les filtres sont séparés par des virgules et traités dans l’ordre de la liste. Chaque filtre est
un triplet définissant un code statut origine, un code statut nouveau, une valeur 1 ou 0 suivant que cette
transition est filtrée ou non.
Deux « wildcards » peuvent être utilisés pour
• * : correspond à tous les statuts
• # (dans le statut de destination) : signifie «vers le même statut »
Exemples :
<status-transition-filter>21:21:0,6:6:0</status-transition-filter>
laisse passer tous les événements sauf les modifications d’appointment de statut 21 (démandé) et 6
(suspendu) qui n’ont pas entraîné de changement de statut
<status-transition-filter>*:*:0,*:31:1</status-transition-filter>
ignore tous les évenements sauf les évenements à l’issue desquels l’appointment est à l'état confirmé.
<status-transition-filter>*:#:0</status-transition-filter>
ne laisse passer que les changements d'états
Optimization-listeners
Un optimization-listener est un objet capable d'écouter les événements se produisant sur le
module d’optimisation globale. A chaque evenement reçu, la donnée envoyée vers le router est un
OptimizationEvent.
Instant-inside-listener
Un instant-insied-listener écoute des évenements de calendrier programmés par un instant-trigger et
déclenche le routeur associé qui doit être un processeur autonome tel que les processeurs d’export. Il
permet de définir une route régulière d’export batch des entités manipulées par Opti-Time.
11
Circulation
Outside-listeners
Cette balise contient une liste d’oustide-listener et de bulk-outside-listeners :
Outside-listener
Un outside-listener est un objet qui écoute les événements venant de l’extérieur d’Opti-Time.
Il écoute les messages arrivant sur l’input-medium spécifié, et envoie le message vers le router spécifié.
Si le router ne traite pas le message (il renvoie FAUX), alors outside-listener renverra également FAUX à
l’input-medium, dont le comportement normal doit être de conserver le message pour un traitement futur.
12
Circulation-config
Optionnel : Il est possible de spécifier un timeout, ainsi qu’un timeout-router.
Le timeout indique le temps en minute maximal de prise en compte du message. Si le message a été
créé depuis plus de temps que la valeur du timeout, alors, après avoir été envoyé au router, et que
celui-ci renvoit FAUX, alors il est également envoyé au timeout-router. La date et l’heure de création du
message dépend de l’input-medium utilisé. Pour un « directory-input-medium », il s’agit de la date de
création du fichier, pour un « jms-input-queue », il s’agit du champ JMSTimestamp.
Il est possible de piloter le retour du listener : si "success-if-timeout-success" est positionné à true, (valeur
par défaut), alors le retour du listener sera VRAI quand le timeout-router est VRAI (alors que le premier
router a renvoyé FAUX). Sinon (si "success-if-timeout-success" est positionné à false), alors le retour du
listener est celui du premier router.
Optionnel : Il est possible de spécifier un diagnostic-router.
Ce routeur est appelé en cas d’erreur sur le router, et après appel éventuel au timeout-router.
Les données envoyées à ce timeout-router ne sont pas les données du message initial, mais
un objet de diagnostic, contenant les informations nécessaires au diagnostic de l’erreur de
traitement, c’est à dire typiquement un message d’erreur. Ces données de diagnostic peuvent être
marshallées par un com.geoconcept.schedule.logic.circulation.impl.DiagnosticDataMarshaller ou un
om.geoconcept.schedule.logic.circulation.impl.DiagnosticDataXMLMarshaller
Ceci sert par exemple à enregistrer les messages d’erreur dans un fichier de log.
En cas d’erreur dans ce traitement pour dignostique alors le listener renvoie FAUX.
Default-unmarshaller reference l’objet de décodage du message envoyé.
Bulk-outside-listener
Un bulk-outside-listener est un objet qui écoute les événements venant de l’extérieur d’Opti-Time, et qui
le découpe en plusieurs messages pour les envoyer au router. Une fois tous les messages envoyés un
rapport est envoyé au report-router.
13
Circulation
Cursor-factory : Ici doit être spécifié l’identifiant d’un CursorFactory, capable de découper le message.
(Voir le paragraphe CursorFactories)
Router : Router recevra comme message une sous-partie du message reçue par l’input-medium, telle
que découpée par Cursor-factory.
Report-router : Ce routeur recevra comme message un objet BulkReport, contenant le résultat de l’envoi
de tous les sous-message au router.
Error-router : Ce routeur recevra comme message une liste des sous messages non traités, ainsi u’une
cause d'échec.
Succes-router : Ce routeur recevra comme message une liste des sous messages traités avec succès,
ces sous messages puvant éventuellement avoir été augmentés par des informations supplémentaires
ajoutées par le routeur.
Jms-connection-listener
Un jms-connection-listener est un objet un peu particulier qui écoute les événements venant de la
connection JMS. Ces événements sont des notifications de connexion ou de déconnexion. Contrairement
aux listeners habituel, les événements reçus par un jms-connection-listener ne contiennent pas de
message (donnée) associé. Pour pouvoir envoyer un message en cas de connexion ou de déconnexion,
il va donc falloir créer le message. Vous ce faire, vous pourrez utiliser le router « message-changerrouter » qui créera remplacera le message vide par un contenu texte.
14
Circulation-config
Jms-connection-to-listen doit contenir l’id de la jms-connection à écouter.
Vous pouvez spécifier l’un ou l’autre ou les deux routers :
on-deconnection-router, qui sera appelé en cas de déconnexion, on-reconnection-router qui sera appelé
en cas de connection (la première) ou reconnexion.
Routers
La balise routers contient deux series de routers : les filter-routers et les processor-routers.
Filter-routers
Les filter-routers sont des routers qui peuvent s’emboîter les uns aux autres. Ils filtrent les messages, ou/
et les dispatchent vers d’autres routers.
15
Circulation
Custom-filter-router
Un custom-custom-processor permet de déclarer un filter personalisé.
Class-name doit indiquer le nom complet de la classe jouant le rôle de processor.
La classe doit respecter les conditions suivantes :
• Avoir un constructeur par défaut
• Implementer l’interface com.geoconcept.schedule.logic.circulation.Router.FilterRouter
• Etre thread-safe car ce tag ne crée qu’une instance, et que les processors peuvent être appellés en
parallèle lors de la reception simulatnée de messages.
Forward-router
Un forward router commence par envoyer le message à un autre router.
Selon le résultat, VRAI ou FAUX, il appelle respectivement success-router ou error-router.Enfin, resultrouter sera appelé avec comme données une un ForwardRouterResultData contenant les résultats des 2
routers précédents : router et success-router, ou router et error-router. Cette donnée peut être marshallée
grace à un com.geoconcept.schedule.logic.circulation.impl.ForwardResultDataXMLMarshaller, ou un
com.geoconcept.schedule.logic.circulation.impl.ForwardResultDataMarshaller.
Pour que le résultat final soit VRAI, il faut que le message ait été correctement traité par le dernier router
appelé, parmi les 3 routers « router », « success-router » et « error-router », result-router n’entrant pas en
ligne de compte.
Le resultat final renvoyé est VRAI dans les trois cas suivant :
• le message a bien été traité par le router :
16
Circulation-config
• et il n’y a pas de success router (1)
• et il y a un success router, et il réussit (2)
• le message n’a pas été traité par le router :
• mais il y a un error router et il réussit (3)
By-extapp-appointment-router
Il s’agit d’un objet spécifique au traitement de rendez-vous. Ce router va diriger le rendez-vous vers un
autre router en fonction de son champ « extapp ». Le champ « extapp », enregistré en base de données,
désigne l’application externe qui a initié le rendez-vous. Il faut donc configurer cet objet en spécifiant
dans extapp-router un router pour chaque valeur que peut prendre « extapp » en base de données.
Si un rendez-vous arrive sur ce router sans que son extapp ne puisse etre retrouvé dans la liste extapprouter, alors le default-router sera appellé.
By-extref-appointment-router
Il s’agit d’un objet spécifique au traitement de rendez-vous. Ce router va diriger le rendez-vous vers un
autre router en fonction de son champ « extref ». Extref est l’identifiant externe à Opti-Time du rendezvous : son identifiant dans un système tiers. (Application de gestion commerciale par exemple).
Le rôle simple de ce router est de séparer le traitement des rendez-vous selon s’ils ont ou non d’extref.
Avoir un extref signifie généralement que le rendez-vous doit être maintenu synchronisé avec une
application externe.
Check-status-appointment-router
17
Circulation
Il s’agit d’un objet spécifique au traitement de rendez-vous.
Ce router va filtrer le rendez-vous en fonction de son statut : Si son statut est inclus dans la liste
« include-status » alors il sera envoyé vers le router spécifié. Sinon, il sera ignoré.
Voici la liste des status-id disponibles :
0
Inconnu
21
Demandé
2
Planifié
6
Déplanifié
10
Annulé
40
Historisé
30
Réservé (« confirmé » pour K par K)
31
Confirmé («fixé » pour K par K)
3
Réalisé
Message-changer-router
Un message-changer-router, comme son nom l’indique est un routeur qui va remplacer le message en
cours de routage par un nouveau message texte, spécifié dans la balise « new-message ». Ce message
ne peut être que du texte.
Routers-distributor
Un routers-distributor distribue le même contenu alternativement à l’un des routers de la liste. Si l’un
des routeurs de renvoie pas un message de succes attendu, le message est alors émis vers le router
suivant (par exemple : une route peut ainsi être re-routée vers plusieurs Opti-Time, réalisant ainsi une
fonctionnalité élementaire de partage des charges ou failover).
18
Circulation-config
Appointment-notifier
Un appointment-notifier crée un message de toute pièce à partir des informations d’un appointment et
de ses différents membres configurés. Il inscrit dans le contexte de circulation les informations sur les
destinataires du message, le sujet du message et le message en lui même. Les sujets et messages
sont personnalisables avec des placeholders que l’appointment-notifier se chargera de remplacer par
les valeurs correspondantes parmi les membres de l’objet Appointment qui réside dans le membre
data du contexte de circulation. L’ensemble des placeholders disponibles est détaillé dans le document
Manuel_utilisateur_msg_de_notif.odt.
• L'élément origin-filter n’est actuellement pas pris en charge, il est défini dans l’intention de filtrer les
notifications sur leur provenance (la personne à l’origine de l'événement).
• L'élément dest permet de spécifier 3 sortes de destinataire du message qui doit être émis :
• CUSTOMER : le contact principal du site client
• CONTACT : le contact du rendez-vous
• RESOURCE : les ressources affectées au rendez-vous
• Les éléments msg et msg-subject contiennent tous deux des identifiants de ressources (messages
qui doivent être définis dans les fichiers notifier.properties). msg correspond à l’identifiant du message
principal, msg-subject correspond au sujet du message qui serait émis dans le cas d’un envoi d’email.
• L'élément output-medium défini le médium de sortie du message.
19
Circulation
Processor-routers
Un processor-router, par opposition aux filter-routers decrits précédemment sont des routers terminaux,
qui ne passent plus la main à d’autres router. Une chaine de router se termine toujours par un processorrouter. Il existe deux sortes de processor-routers : les indide-processors et les outside-processors.
Inside-processors
Les inside-processors sont des processor-routers qui ont une action à l’interieur d’Opti-Time.
Custom-inside-processor
Un custom-inside-processor permet de déclarer un processor personalisé.
Class-name doit indique le nom complet de la classe jouant le rôle de processor.
La classe doit respecter les conditions suivantes :
• Avoir un constructeur par défaut
• Implementer l’interface com.geoconcept.schedule.logic.circulation.Router
• Etre thread-safe car ce tag ne crée qu’une instance, et que les processors peuvent être appellés en
parallèle lors de la reception simulatnée de messages.
20
Circulation-config
Appointment-request-receiver
Un appointment-request-receiver est l’objet qui va traiter la demande de rendez-vous envoyée de
l’exterieur : elle va insérer, modifier ou supprimer le rendez-vous en base en fonction de la demande.
Appointment-request-receiver-new
Non documenté : Uniquement présent dans le XSD pour la mise au point du module. Ne doit pas être
utilisé.
Reference-data-receiver
Un appointment-request-receiver est l’objet qui va traiter la demande modification des données de
reference (resource humaine, site de travail, etc) : elle va insérer, modifier ou supprimer les données en
base en fonction de la demande.
csv-record-processor
Processeur d’import d’entités (resource humaine, site de travail, clients, rendez vous etc) à partir
d’enregistrements en mode texte csv. La première ligne définit les noms des champs, les lignes suivantes
les enregistrements à importer. Le typped’entité est détecté en fonction du nom des champs présents
(comme dans la fonction Importer CSV du module d’administration ). Ce routeur doit être associé à un
écouteur (listener) de type bulk-outside-listener , qui va lui transmettre un à un les lignes d’un fichier issu
d’un répertoire surveillé ou passé par une requête http.
Le processeur d’import doit être configuré selon la même logique que le dialogue d’import csv du module
d’administration (geocodage, worksite pour le geocodage par défaut, delimiter de texte, …)
sql-importer-processor
21
Circulation
Processeur d’import d’entités (resource humaine, site de travail, clients, rendez vous etc) à partir d’une
interrogation d’une table d’une base ou vue dans une base de donnée externe. Les enregistrements sont
obtenus par le texte de requête contenu dans l’attribut « select-clause ».
Les enregistrements retournés sont communiqués à un processeur d’import détecté d’après la
combinaison des noms de colonnes, suivant le modèle de l’import Opti-Time-CSV.
Un dictionnaire peut être associé au processor pour effectuer la correspondance entre nom de colonne
issu du select et nom de colonne du modèle d’import Opti-Time-CSV
Ce processeur permet également de modifier dynamiquement la requête, si la requête comporte des
ancrages (placeholders). Voir Le sous paragraphe suivant
Sql-script-processor
Permet d’exécuter des scripts SQL.
22
Circulation-config
On lui passe en paramètre une connexion SQL et l’emplacement d’un fichier script SQL.
Lorsqu’il est appelé, le script est exécuté sur la base de donnée définie dans la connexion SQL.
En cas d’erreur dans le traitement du script, on appelle le routeur d’erreur spécifié en paramètre « errorrouter ».
Le paramètre optionnel command-delimiter devrait permettre de spécifier le délimiteur entre 2
expressions SQL, mais il n’est encore implémenté.
Le paramétrage dynamique des imports sql (sql-script-processor, sql-importer-processor) .
Plusieurs méthodes et astuces existent pour la modification dynamique de la de la requête sql utilisée
dans un sql-importer-processor, ou dans un Sql-script-processor. Ces méthodes se basent sur la
détection, dans la chaine sql configurée pour le routeur, de balises d’insertions de paramètre, ou
« placeholders »
Placeholder implicite « ? » Si la requête comporte une where clause utilisant des « ? », ces points
d’interrogation sont remplacés par les paramètres portés par le contexte de circulation dans l’ordre où ils
ont été transmis à ce contexte:
Exemple :
select * from exch_customer where ordererid=? And requiredresources = ?
Dans cet exemple, les deux points d’interrogation sont remplacés par les deux premiers paramètres issus
du contexte de circulation qui les a recçu d’un maillon précédent de la chaîen de circualtion. Par exemple,
si le processeur est associé à une requête http (listener d’un http-medium ), et que l’utilisateur (via une
page web ) a invoquué ce médium
http://<serveur>/gss/circulation/mediumhttp?param1=a,param2=b.
On utilisera les paramètres successifs de la requête (a et b) pour les inscrire dans celle ci sous cette
forme
select * from exch_customer where ordererid='a' And requiredresources = 'b'
Note : les paramètres sont toujours remplacés avec un encadrement en quote simple, correspondant à la
norme sql pour les chaînes de caractères
L’usage des palceholder « ? » est assez limitatif (nommage implicite des paramètres) et on lui préfère
l’usage des placeholders nommés Placeholder « :<nomdeVariable »'Si la requête comporte des
placeholders nommés par des noms de variables connus du contexte de circulation, ils sont remplacés
par des valeurs correspondantes
Exemple :
select * from exch_customer where ordererid=:ordererid And requiredresources = :myresources
Dans ce cas, les châines :ordererid et :myresources sont remplacés par les deux premiers paramètres
issus du contexte de circulation , quels qu’ils soient, par exemple , si le processeur est associé à une
23
Circulation
requête http (listener d’un http-medium ), par exemple http://<serveur>/gss/circulation/mediumhttp?
ordererid=a,otherparam=c,myresources=b. on utilisera les paramètres a et b de la requête http pour
rédiger la requête sql suivante
select * from exch_customer where ordererid='a' And requiredresources = 'b'
L’utilisation des placeholders nommés est fortement recommandée car elle permet d’exploiter des
variables véhiculées automatiquement dans certains contextes de circulation comme :
• :AREAID : la référence externe de la région : forunie par les listeners d’optimisation, ou les listeners de
modification de rendez vous ou de customer
• :OPTIMIZATIONSTARTDATE la date de début de la période d’optimisation, fournie par le listener de
déclenchement des optimisations batch
• :OPTIMIZATIONENDDATE la date de fin de la période d’optimisation, fournie par le listener de
déclenchement des optimisations batch
• :ENTITYID la référence externe de l’entité, fournie les listeners de modification de rendez vous ou de
customer
• :APPOINTMENTID : la référence externe de l’entité,fournie par les listeners de modification de rendez
vous
• :RESOURCEID : la référence externe de la ressource assigéne au rendes vous ,fournie par les
listeners de modification de rendez vous
• :LastImportedDate : la date système , au format ODBC canonique « yyyy-MM-dd HH:mm:ss.sss »
recueillie jurste avant le lancement du dernier import par le processeur d’import sql…
Astuce : réalisation d’un import sql temps réel avec le paramètre :LastImporteddate
On peut utilemen combiner une table comportant une colonne d’horodatage des modifications (par
triggers ou valeur par défaut dynamique) avec le paramèrte :LastImportedDate, pour contraindre OptiTime a sélectionner les dernières lignes modifiées dans une table depuis le précédent import. Cette
méthode est robuste car le paramètre est stocké dans la table de configuration Opti-Time. Suivant
les moteurs de base de données, la difficulté réside dans la rédaction de la syntaxe en prenant en
compte les spécificités de format de chaque provider. Des scripts d’exemples sont fournis dans les
livraisons Opti-Time , pour les wher clause 'ODBC canoniques », et pour la constitution de champ
« LastUpdateDate » dans les tables d'échanges « modèles »
Exemple en Microsoft sql server
select * from exch_APPOINTMENT
where DATEDIFF(SECOND,lastUpdate,CONVERT(datetime,:LastImportedDate,121) ) < 0
Exemple en Oracle
select * from exch_APPOINTMENT
where ( lastUpdate > to_timestamp(:LastImportedDate,'YYYY-MM-DD HH24:mi:ss.ff4'); )
Opti-Time-services-processor
24
Circulation-config
Permet d’invoquer un sous-service interne identifié par un nom de service. Le comportement de ce
service peut être modulé par le paramètre passé dans l’attribut parameter. Cet outil est généralement
utilisé en terminaison d’une route recueillant une requête http (http-input-medium) et passant les données
XML postées dans la requête en entrée du service en question.
Parmi les services actuellement disponibles : le geocodage, l’obtention d’itinéraire, le « routage » (ou
ordonnacement ) calcul d’une route optimisée entre étapes d’une ressource pour une journée.
En règle générale, il s’agit de services de consultation qui ne modifient pas l'état interne de la base OptiTime. Leur incorporation à l’ensemble « inside-processor » est donc surtour formelle et historique.
command-processor
Permet d’exécuter une commande système. La commande est stockée dans l’attribut full-path. Des
arguments peuvent être données avec la liste de tag arguments.Prendre garde au fait que la commande
système doit être executable par l’utilisateur système agissant au travers d’un service ou démon. Ce
routeur peut être utilement utilisé pour traiter un fichier émis dans un répertoire par un simpel-medium
sender.
Outside-processors
Par opposition aux inside-processors, les outside-processors vont effectuer un traitement en direction de
l’exterieur d’Opti-Time.
Simple-medium-sender
Une instance de simple-medium-sender sert à envoyer un message vers un output-medium. Le
marshaller spécifié est l’objet capable de transformer les données à envoyer en flux de données pour le
output-medium.
25
Circulation
csv-record-export-processor
Routeur destiné à l’emission de données vers l’exterieu, au format csv, en réponse à une stimulation
interne programmée (instant-inside-listener ou optimization-listener).
Les données à exporter sont définis par la liste de champs fourni dans l’attribut listField. Cette liste fournit
une combinaison de champs qui permet de détecter un processeur d’export, conformément au modèle
Opti-Time-CSV. De nombreux attributs sont disponibles pour moduler le comportement et le périmètre de
l’export :
• separator : caractère de séparation des champs (par défaut ",")
• textDelimiter : caractère d’encadrement des données textuelles (par défaut ')
• valueListSeparator : caractère de séparation des valeurs des listes de valeurs exportées dans certains
champs (par défaut ;). Ce caractère doit évidemment être différent du caractère de séparation des
champs.
• dateFormat : format d'écrtiture souhaité pour les valeurs dates, rédigé suivant le pattern java
( default="yyyy/MM/dd" )
• timeFormat : format d'écrtiture souhaité pour les valeurs heures et durée (défaut hh:MM)
• useDurationTimeFormat : mettre à true/vrai/O/Y/1 pour indiquer que l’export des durées s’effectue
sous forme formattée comme une heure (utilisant timeFormat). Sinon, les durées sont exportées par un
entier, en nombre de minutes.
• extractionKind : mot clef définissant le sous-ensemble des entités à exporter, parmi les entités détectés
en fonction de la liste des champs. les valeurs existantes sont :
• ALL : exporte toutes les entités.
• LASTUPDATED : exporte les dernières entités crées ou modifiées (disponible pour certaines
collections d’entités comme les rendez vous ou les indisponibilités).
• extractionParam : paramètre additionnel passé au processeur. Par exemple « 1 » donne le nombre de
jours à rétro inspecter pour l’export des derniers modifiés dans la stratégie LASTUPDATED. Le default
est "1" (ce qui signifie depuis le dernier jour si la stratégie LASTUPDATED ). L’export est déclenché.
Par un listener d'évenement interne, (trigger periodic, AppointmentInsideListener) ou par une stimulation
externe (requête http par exemple). Comme pour un Simple-medium-sender, le résultat est communiqué
à un output-medium, à l’aide d’un marshaller standard (transformation de texte).
sql-exporter-processor
26
Circulation-config
Routeur destiné à l’emission de données vers l’exterieur, au moyen d’un ordre sql. Ce routeur est activé
et extrait les données Opti-Time comme le routeur csv-recors-export-processor. En revanche, il n’a pas
besoin de medium de sortie, car son flux sortant est directement émis via la connection sql.
On retrouve les paramètres permettant de délimiter le périmètre à exporter, lorsque le routeur n’est pas
situé en sortie d’un écouteur de notification de mise à jour d’une entité spécifique :
• list-field : liste (séparée par une virgule) des champs Opti-Time-CSV à exporter. La combinaison des
noms permet aussi la détection sans ambiguïté des classes d’entités à exporter.
• attribut extractionKind : mot clef définissant le sous-ensemble des entités à exporter, parmi les entités
détectés en fonction de la liste des champs. les valeurs existantes sont :
• ALL : exporte toutes les entités.
• LASTUPDATED : exporte les dernières entités crées ou modifiées (disponible pour certaines
collections d’entités comme les rendez vous ou les indisponibilités).
• attribut extractionParam : paramètre additionnel passé au processeur. Par exemple « 1 » donne le
nombre de jours à rétro inspecter pour l’export des derniers modifiés dans la stratégie LASTUPDATED.
Le default est "1" (ce qui signifie depuis le dernier jour si la stratégie LASTUPDATED). L’export est
déclenché.
On a ensuite les paramètres décrivant la cible
• table: le nom de la table externe à mettre à jour (il peut s’agir d’une vue).
• action : le type d’action à effectuer : les valeurs admises sont :
• UPDATE_INSERT (par défaut) Tente un update à l’aide du champ associé à l’ID (externe) puis, si
aucun enregistrement n’a été mis à jour, tente une insertion (la table doit posséder une clef primaire
en auto-increment, les séquences ne sont pas prises en compte pour le moment) ;
• UDPATE : Tente exlusivement un update ;
• INSERT : effectue exclusivement un insert ;
27
Circulation
• DELETE : détruit les lignes pour l’ID de chaque enregistrement exporté ;
• DELETEALL: détruit toutes les lignes.
• where-clause une where clause additionnelle ajoutée à l’ordre généré, qui comporte éventuellement
déjà une where clause, pour UPDATE et DELETE where ID=IdValue. IL est donc inutile de rajouter le
mot « WHERE ».
• dictionary référence à un dictionnaire pour effectuer la correspondance des champs.
Mediums
Les mediums sont des moyens de communications : ils sont soit input-medium, c’est à dire destinés à
être lus par Opti-Time, soit output, destinés à être écrits par Opti-Time.
Input-mediums
4 sortes d’inputs mediums sont proposés : jms-input-queue, directory-input-medium, mailbox-inputmedium et http-input-medium.
Jms-input-queue
Un jms-input-queue est un lien vers une queue JMS. Le nom JNDI de la queue doit être entrée dans la
balise « jndi-name ».
Il faut également associer une connection jms : La balise jms-connection doit contenir l’id de la
connection déclarée plus loin.
Directory-input-medium
Un directory-input-medium spécifie un répertoire à écouter, ou chaque fichier sera considéré comme un
message. Ce medium parcourt régulièrement le répertoire pour découvrir les fichiers.
28
Circulation-config
Les paramètres sont les suivants :
• location : le chemin complet du répertoire. Si le répertoire n’existe pas, il est automatiquement créé.
• Message-selector : l’une des valeurs suivantes : « addedFiles » , « allFiles » ou « filesList ».
• addedFiles signifie qu’a chaque parcours du répertoire, seuls les fichiers qui viennent d'être ajoutés
seront pris en compte
• allFiles signifie qu’a chaque lecture du répertoire, tous les fichiers présents seront pris en compte.
(optionnel, par defaut : addedFiles)
• filesList permet de définir une liste de mots clés qui représentent la "racine" que doivent contenir les
noms des fichiers présents dans le répertoire avant de déclencher leur notification. La liste de mots
clés doit être séparée par des |. L’ordre de notification des fichiers sera alors fixé par celui des mots
clés correspondants. Dans le cas où les noms de plusieurs fichiers contiendraient l’un des mots clés,
le fichier le plus ancien sera traité en premier dans le premier lot de notifications.
• scan-time-interval : l’espace de temps entre chaque parcours du répertoire, en millisecondes.
(optionnel : ne doit pas être specifié conjointement à directory-trigger ou instant-trigger)
• delete-on-success : ignoré (toujours à true)
• nb-max-try : nombre de tentatives maxi avant abandon et déplacement du fichier dans failure-trashlocation
• failure-trash-location : répertoire poubelle des fichiers qui ont été abandonnés à la suite de nb-max-try
tentatives.
29
Circulation
• directory-trigger : l’ID d’un directory-trigger (voir plus loin). Ne doit pas être utilisé conjointment à scantime-interval ou instant-trigger.
• Instant-trigger : l’ID d’un instant-trigger qui générera l'événement de scrutation du répertoire. Ne doit
pas être utilisé conjointment à scan-time-interval ou directory-trigger.
• Trigger-files-list : Une liste de mots clés permettant d’attendre que chacun des mots clés trouve un
fichier dans le répertoire du medium dont le nom le contienne, avant de lancer les notifications.
• charset-name : Le nom du charset à utiliser pour lire les fichiers.
Exemple de fonctionnement du mode « filesList » :
Si on a :
• mots clés : "gss_commandes|gss_clients|gss_absences_techniciens"
• et les fichiers :
• gss_commandes_05-06-11.csv datant du 05/06/11
• gss_commandes_06-06-11.csv datant du 06/06/11
• gss_clients_05-06-11.csv datant du 05/06/11
• gss_absences_techniciens_05-06-11.csv datant du 05/06/11
Seul l’import des fichiers du 05/06/11 sera déclenché … Le fichier gss_commandes du 06/06/11 devra
attendre l’arrivée de 2 autre fichiers contenant les mots clés gss_clients et gss_absences_techniciens
pour que son lot soit importé.
Mailbox-input-medium
Un mailbox-input-medium spécifie une boite à lettre à écouter, ou chaque mail reçu ou fichier attaché
sera considéré comme un message. Ce medium interroge régulierement le serveur de mail.
30
Circulation-config
Les paramètres sont les suivants :
• Une des deux balises suivantes doit être indiquée :
• Jndi-name contient le nom jndi de l’objet javax.mail.Session utilisé pour envoyer le mail.A utiliser
quand circulation est executé dans un serveur JEE.
• mail-session contient l’identifiant se referant à une balise mail-session déclaré dans la balise
« connections ». A utiliser lorsque le code est executé en dehors d’un serveur JEE. Par exemple
dans les tests unitaires.
• Folder : Le nom du dossier de mail à écouter. (optionnel, par défaut INBOX)
• Username : Le nom de l’utilisateur à utiliser pour s’authentifier auprès du serveur de mail.
• Password : Le mot de passe de l’utilisateur à utiliser pour s’authentifier auprès du serveur de mail.
• Cron-periodicity : L’expression « cron » permettant de spécifier la periodicité d’interrogation du serveur
de mail.Voir annexe « Expressions Cron »
Exemples :
• Toutes les dix secondes : 0/10 * * * * ?
• Tous les jours à midi : 0 0 12 * * ?
• Toutes les 5 minutes de 14 heures à 14h55 : 0 0/5 14 * * ?
• Delete-on-success : ignoré (toujours à true)
• handle-raw : valeur booleéene : true ou false. Indique si le corps du mail brut doit être traité comme un
message.
• handle-attachment : valeur booleéene : true ou false. Indique que les pièces attachées ayant des nom
de fichier doivent être traité comme des messages.
• handle-inline : valeur booleéene : true ou false. Indique que les pièces attachées sans nom de fichier
doivent être traité comme des messages.
Http-input-medium
Un http-input-medium permet d'écouter sur le port HTTP de l’application Web.
Si la page de login d’Opti-Time est accédée via :
http://myserver:myport/gss/
Alors circulation écoute tous les messages envoyés sur des url de la forme :
http://myserver:myport/gss/circulation/myInputMediumName
31
Circulation
Par exemple :
La déclaration de :
<http-input-medium>
<id>myInput</id>
<name>plateforme123</name>
</http-input-medium>
Entrainera l'écoute de :
http://myserver:8080/gss/circulation/plateforme123
• "Opti-Time" est le nom de l’application
• "circulation" est le préfixe non configurable
• "plateforme123" est le nom de l’input spécifié dans sa balise "name".
Fonctionnement
Un http-input-medium se comporte de façon similaire aux autres input-medium : il écoute les message et
le transmet à son listener déclaré par ailleurs. Le message est attendu dans le corps de la requete HTTP
en méthode POST (sans variable HTTP).
Il est possible de passer, pour des raisons de mise au point, le message en méthode GET dans la
variable "message", par exemple :
http://localhost:8080/gss2.5/circulation/KPK30?message=<request><info.....
Le retour de message
Le retour d’une requête HTTP auprès de de circulation est toujours un message XML, conforme au
schéma "circulation-result" (voir chapitre Référence : Format de retour : schéma "circulation-result", page
44). Ce document de retour contiendra toujours la valeur "success" (à true ou false). Et selon le type de
retour, des explications sommaires ("explanation") ou détaillées ("message-info").
Techniquement cet écouteur est implémenté par une servlet. Cette servlet "CirculationServlet" est
déclarée dans le fichier web.xml. Une telle servlet partage le pool de thread avec les autres servlets (et
donc l’ihm). Une seule servlet "CirculationServlet" peut être déclarée par Opti-Time. Les threads sont
synchronisés sur le nom spécifié par name : Les messages arrivant sur deux url différentes seront traités
en parallèle, ceux arrivant sur des url identiques seront traitées en série.
Element synch :
Sur versions > 3,31, l’element synch peut être positionné à false pour permettre de traiter en série les
messages arrivant sur une même url. Ce comportement ne doit être appliqué que pour des messages
sans effets de bords ni risques de concurrence d’accès (exemple une requête de geocodage, mais pas
une création de client)
32
Circulation-config
Output-mediums
Les output-mediums sont des moyens de communication en sortie.
jms-output-queue
Un jms-output-queue est un lien vers une queue JMS sur laquelle on souhaite envoyer des messages. Le
nom JNDI de la queue doit être entrée dans la balise « jndi-name ».
Il faut également associer une connection jms : La balise jms-connection doit contenir l’id de la
connection déclarée plus loin.
• Delivery-mode : Pas encore implementé : Tous les messages envoyés sont en mode « persistant ».
Directory-output-medium
Un directory-output-medium spécifie un répertoire sur lequel écrire, ou chaque message sera écrit sous
forme d’un fichier (un fichier par message).
Paramètre :
• location : le nom complet du répertoire dans lequel créer des fichier.
• Prefix : une chaîne préfixe de tous les fichiers.
• Suffix : une chaîne suffixe de tous les fichiers. (typiquement l’extension).
33
Circulation
Le nom du fichier est construit selon la forme suivante :[prefix][date, heure precise de la création du
fichier][suffix]
Exemple : Si prefix= « MESSAGE » et suffixe= « .XML », le fichier aura la forme suivante :
MESSAGE 2005.02.14 14h57m17s715ms.XML
• Filename-pattern : une chaîne libre représentant le nom du fichier, à l’intérieur de laquelle les souschaînes {0},{1},{2},{3},{4},{5},{6} sont respectivement remplacées par :
• la date du jour
• l’identitifant du message
• le nom du medium
• le nom du support
• l’indicateur du nombre de ligne (pour les messages « bulks »)
• le nom du contexte de circulation
• un numéro au hasard
Bien sûr, l’utilisation de filename-pattern est une alternative à celle des prefixe/suffixes
Exemple : Si filename-pattern =result-{0}-{3}-{6}.csv, le fichier aura la forme suivante :
result-2009.09.24_09h44m14s037ms-Simulation_priseRDV_40-577525.csv
file-output-medium
File-output-medium est un medium qui ecrit les messages dans un fichier unique, les messages étant
insérés les uns derrière les autres. C’est typiquement ce qui est utilisé pour remplir un fichier de logs.
• Location désigne le chemin complet du fichier.
• roll-size la taille maximale du fichier, en kilo octets : une fois atteinte cette taille, le fichier est recopié
(avec la date et l’heure dans le nom), et on repart sur un fichier vide.
Mail-output-medium
Mail-output-medium est le medium capable d’envoyer un email.
• Une des deux balises suivantes doit être indiquée :
• Jndi-name contient le nom jndi de l’objet javax.mail.Session utilisé pour envoyer le mail.A utiliser quand
circulation est executé dans un serveur JEE.
34
Circulation-config
• mail-session contient l’identifiant se referant à une balise mail-session déclaré dans la balise
« connections ». A utiliser lorsque le code est executé en dehors d’un serveur JEE. Par exemple dans
les tests unitaires.
• From doit contenir l’adresse de l’expéditeur des emails.
• To doit contenir l’adresse du destinataire.
• Subject doit contenir le texte qui apparaîtra dans le sujet du mail.
Le corps du mail sera rempli avec ce que le marshaller produit . (Le marshaller est celui designé dans le
simple-medium-sender associé à ce medium).
Http-output-medium
Un Http-output-medium permet d’envoyer sur une URL via la méthode POST.
Le message est considéré comme envoyé si l’URL a bien répondu et a répondu avec un status HTTP =
200 (OK).
Log
Log ecrit les message directement dans le fichier de log général d’Opti-Time.
• Prefix est un texte inséré devant chaque message loggué.
Mail2sms-output-medium
Un mail2sms-output-medium permet d’envoyer un SMS en passant par une interface
SMTP d’un fournisseur de SMS. En envoyant un email à l’adresse numero_de_tel@mail
[mailto:numero_de_tel@mail]_domain_name, le contenu du mail est envoyé au numéro de téléphone de
l’adresse email.
35
Circulation
Un mail2sms-output-medium est défini comme un mail-output-medium avec simplement le paramètre
mail-domain-name en plus qui permet de définir le nom de domaine du fournisseur de SMS.
Sms-output-medium
Un sms-output-medium permet d’envoyer un SMS au moyen d’une interface HTTP d’un fournisseur de
SMS.
• L'élément url défini l’URL du serveur ciblé en HTTP.
• L'élément verb permet de préciser si l’envoi des variables doit se faire en GET ou en POST.
36
Circulation-config
• L'élément respAnalyzer représente une routine d’analyse de la réponse du serveur (à une requête)
pour déterminer si l’envoi a été correctement effectué. Dans le cas d’utilisation d’un serveur Esendex,
utiliser la valeur « Esendex ».
• Chaque élément de query-params représente ensuite une variable de requête HTTP. Pour un queryparam donné, un élément var-name représente le nom de la variable HTTP concernée.
• Un élément var-marshaller permet de définir comment sera remplie cette variable. Les possibilités sont
les suivantes :
• LOGIN : l’utilisateur du compte chez le fournisseur d'énvoi de SMS sera récupéré dans l'élément varvalue
• PASSWORD : le mot de passe du compte chez le fournisseur d’envoi de SMS sera récupéré dans
l'élément var-value
• PHONE : le numéro de téléphone destinataire
• CIRC_MESSAGE : la variable doit être remplie avec le message provenant du contexte
• RESOURCE_MESSAGE : la variable doit être remplie avec message dont l’identifiant de ressource
sera récupéré dans l'élément var-value.
• UNKNOWN : pas de traitement particulier pour cette variable (on utilise la valeur fournie dans
l'élément var-value)
Url-output-medium
L’url-output-medium est défini et fonctionne de la même manière qu’un directory-output-medium. Avec la
possibilité supplémentaire de pouvoir prendre en charge des URL FTP.
Transformers
37
Circulation
Les transformers sont soit des « marshaller », soit des « unmarshallers », c’est à dire des objets dont le
role est de transformer respectivement des objets Java en flux texte, ou du flux texte en objets Java.
Une nouvelle catégorie de transformer existe depuis la version 1.3 de circulation : Les cursors-factories,
qui permettent de découper un message en plusieurs sous-messages.
Unmarshallers
Unmarshallers contient la liste des unmarshallers. Il n’existe aujourd’hui qu’une seule sorte
d’unmarshaller : les by-class-appt-unmarshallers.
By-class-appt-unmarshaller
Un by-class-appt-unmarshallers permet de créer un objet unmarshaller à partir d’un nom de classe Java.
Remarque : Aujourd’hui ce modèle de fonctionnement n’est pas toujours opérationnel, et la plupart du
temps, vous utiliserez des PseudoUnmarshaller. Appuyez vous sur le circulation-config fourni en exemple
pour savoir comment configurer ces objets.
Marshallers
By-class-appt-marshaller
Un by-class-appt-marshallers permet de créer un objet marshaller à partir d’un nom de classe Java.
Même remarque que pour les unmarshallers.
Quelques marshallers prédéfinis
38
Circulation-config
Cette partie de la documentation et du module de circulation restent à finaliser.
Aujourd’hui il est possible de spécifier les marshaller par nom de classe.
Les noms de classes disponibles sont :
• com.geoconcept.schedule.logic.circulation.impl.PseudoMarshaller
• A utiliser par défaut.
• com.geoconcept.schedule.logic.circulation.impl.appointment.AppointmentXMLMarshaller
• A utiliser en bout d’un circuit initié par un AppointmentInsideListener
• com.geoconcept.schedule.logic.circulation.impl.DiagnosticDataMarshaller ou
com.geoconcept.schedule.logic.circulation.impl.DiagnosticDataXMLMarshaller
• A utiliser au bout d’un circuit commençant par le diagnostic-router d’un outside-listener
• com.geoconcept.schedule.logic.circulation.impl.ForwardResultDataMarshaller ou
com.geoconcept.schedule.logic.circulation.impl.ForwardResultDataXMLMarshaller
• A utiliser au bout d’un circuit commençant par le result-router d’un forward-routed
Les deux marshallers com.geoconcept.schedule.logic.circulation.impl.DiagnosticDataXMLMarshaller
com.geoconcept.schedule.logic.circulation.impl.ForwardResultDataXMLMarshaller générent les données
qui respectent le même schéma XML : circulation-result.
Cursor-factories
Les cursors-factories permettent de découper un message en plusieurs sous-messages.
Il n’existe aujourd’hui qu’une seule sorte de cursor-factory : les line-by-line-cursor-factory
line-by-line-cursor-factory
Un line-by-line-cursor-factory comme son nom l’indique est capable de fabriquer un curseur de parcours
de texte ligne à ligne. Il permet donc de découper un message sous-messages constitués de chacune
des lignes du message initial.
Connections
Les connections referent des connections vers l'éxterieur d’Opti-Time. Il n’existe aujourd’hui deux sortes
de connection : Les connections JMS, et les connections aux serverur de mail (« mail-session »).
39
Circulation
Jms-connection
Les jms-connections représentent des connections JMS.
• Factory-jndi-name est le nom JNDI d’un ConnectionFactory.
• Reconnection-delay est le délai de tentative de reconnection en cas de perte de cette connection.
Mail-session
Les mail-session représentent des données de connections aux serveur de mail.
• Store-protocol est le protocole de stockage, c’est à dire « pop3 » ou « imap »
• transport-protocol est le protocole de transport, c’est à dire
sql-connection
Les sql-connections représentent des connections jdbc. Elles sont requises par les processeurs d’import
ou d’export SQL.
• driver : le nom de classe jdbc du driver
• ConnectionString : la chaîne de connection jdbc
• si nécessaire : le mot de passe et nom de compte d’authentification
40
Circulation-config
• L'élément synchronized optionnel (valeur par défaut = true ) permet de définir le comportement de la
conenciton sql si elle est sollicitée par plusierus routeurs. Si synchronized est à true, les processeurs
qui requière accès à cette connection sont mis en attente par le processeur qui l’utilise actuellement.
root-path-connection
Il permet de factoriser un chemin racine commun à plusieurs définitions de chemins relatifs dans les
routeurs directory-input-medium, directory-output-medium, url-input-medium, url-output-medium, fileoutput-medium. Bien sûr, si le tag <root-path-connection> n’est pas défini dans ces routeurs, on suppose
que les chemins saisis sont absolus.
Son utilisation repose sur le principe d’une concaténation des chemins définis dans les routeurs au
chemin racine.
Triggers
Les triggers sont des objets déclencheurs d'événements.
Directory-trigger
Un directory-trigger scanne un ou plusieurs répertoire toutes les N millisecondes, N spécifié dans scantime-interval.
A noter que l’on ne spécifie pas ici la liste des répertoires à scanner : Ce sont les directory-input-medium
qui demandent à leur directory-trigger de scanner leur répertoire.
Note : L’utilisation d’un trigger est optionnel dans directory-input-medium, mais est fortement conseillé
quand beaucoup de directory-input-medium sont configurés : Cela permet de mutualiser les opérations
de scan de répertoire, c’est à dire de ne consommer qu’une seule thread pour l’ensemble des répertoire,
au lieu d’une thread par répertoire.
Instant-trigger
Un instant-trigger permet de déclencher des événements à des dates programmées.
On peut les paramétrer soit avec un décompte de minutes avant départ plus une périodicité :
• startMinute : nombre de minutes à attendre avant le premier événement
• period : unité d’expression de la durée périodique
• InstantTrigger.UNIT_MINUTE = 0
• InstantTrigger.UNIT_DAY = 1
• InstantTrigger.UNIT_WEEK = 2
• periodLength : durée périodique entre chaque événement généré.
41
Circulation
Soit directement avec une expression cron (cf ANNEXE 1 : Les Expressions Cron) : * cron-periodicity :
chaîne expression cron
L'élément synchronized optionnel (valeur par défaut = true ) permet de définir le comportement du trigger
lordqu’il se déclenche tandis que l'évenement déclenché plus tôt n’est pas terminé. Si synchronized est à
true, on ne peut pas déclencher l'évenement si le précédent est toujours en cours. De ce fait, l'évenement
est simplement annulé, et se redéclenchera à la prochaine période. La synchronisation est hautement
recommandée pour les triggers de fréquence brève déclenchant des processeurs d’import (sql, csv…) de
façon quasi continue.
Interruptors
Les interruptors sont des objets capables d’interrompre et de redémarrer les listener. Il n’existe qu’une
seule sorte de déclencheur aujourd’hui : les business-lock-interruptors.
Business-lock-interruptors
Un business-lock-interruptor est un objet capable d’interrompre un listener en cas de verrouillage d’une
ressource de l’application, par exemple d’une région.
Il arrête le listener (et le médium associé) au moment du verrouillage et le redémarre au moment du
déverrouillage.
• Resource-type doit contenir le nom du type de « ressource » verrouillée. La seule valeur possible
aujourd’hui est LOCK_APPOINTMENTS_ON_REGION.
• Selector est le selecteur de resource. Dans le cas où resource-type =
LOCK_APPOINTMENTS_ON_REGION, selector doit contenir l’identifiant externe de la région.
• Listener-to-interrupt doit contenir l’id du Listener à interrompre.
Exemple :
<interruptors>
<business-lock-interruptor>
<id>KPK30LockInterruptor</id>
<resource-type>LOCK_APPOINTMENTS_ON_REGION</resource-type>
<selector>DRS30</selector><!--region extref-->
<listener-to-interrupt>KPK30listener</listener-to-interrupt>
</business-lock-interruptor>
</interruptors>
Référence : Format de retour : schéma "circulation-result"
Le format de retour généré par les masrshallers DiagnosticDataXMLMarshaller et
ForwardResultDataXMLMarshaller, ainsi que par tout listener branché sur un http-input-medium est
spécifié dans le schéma XML "circulation-result" :
42
Référence : Format de retour : schéma "circulation-result"
Un document circulation-result n’est composé que d’un seul router-result, contenant les balises
suivantes. Toutes ces balises sont optionnelles.
success
Type : Standard XMLSchema booléen, (true ou false).
43
Circulation
Indique si le traitement du message s’est déroulé correctement ou non.
error-explanation
Type : chaine de caractères Contient une éventuelle explication textuelle de l’erreur
error-code
Type : chaine de caractères Contient un éventuel code d’erreur, sous forme de chaine.
Cette chaîne dépend du traitement effectuée. Aujourd’hui l’une des valeurs suivantes :
• ERROR : Erreur générale, pas de code spécifique.
• PARSE_ERROR : Erreur pendant le parsing du message reçu.
• IMPORT_ERROR : Erreur pendant l’import du message.
• LOCK : Traitement impossible car verrouillage en cours.
message-info
Contient éventuellement des informations sur le message ayant provoqué une erreur. Voir schéma plus
haut pour les détails des balises internes.
briefs
Liste de message d’erreur ou de succès pour chaque element d’un traitement en lot.
message
non implémenté.
44
ANNEXE 1- Les Expressions Cron
ANNEXE 1- Les Expressions Cron
Issus de la documentation de la librairie Java « Quartz » :
A "Cron-Expression" is a string comprised of 6 or 7 fields separated by white space. The 6 mandatory and
1 optional fields are as follows:
Field Name
Allowed Values
Allowed Special Characters
Seconds
0-59
,-*/
Minutes
0-59
,-*/
Hours
0-23
,-*/
Day-of-month
1-31
,-*?/LWC
Month
1-12 or JAN-DEC
,-*/
Day-of-Week
1-7 or SUN-SAT
,-*?/LC#
Year (Optional)
empty, 1970-2099
,-*/
The character is used to specify all values. For example, "" in the minute field means "every minute".
The ? character is allowed for the day-of-month and day-of-week fields. It is used to specify no specific
value. This is useful when you need to specify something in one of the two fileds, but not the other. See
the examples below for clarification.
The - character is used to specify ranges For example "10-12" in the hour field means "the hours 10, 11
and 12".
The , character is used to specify additional values. For example "MON,WED,FRI" in the day-of-week
field means "the days Monday, Wednesday, and Friday".
The / character is used to specify increments. For example "0/15" in the seconds field means "the
seconds 0, 15, 30, and 45". And "5/15" in the seconds field means "the seconds 5, 20, 35, and 50". You
can also specify / after the character - in this case is equivalent to having 0 before the /.
The L character is allowed for the day-of-month and day-of-week fields. This character is short-hand for
"last", but it has different meaning in each of the two fields. For example, the value "L" in the day-of-month
field means "the last day of the month" - day 31 for January, day 28 for February on non-leap years. If
used in the day-of-week field by itself, it simply means "7" or "SAT". But if used in the day-of-week field
after another value, it means "the last xxx day of the month" - for example "6L" means "the last friday of
the month". When using the L option, it is important not to specify lists, or ranges of values, as you’ll get
confusing results.
The W character is allowed for the day-of-month field. This character is used to specify the weekday
(Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the
day-of-month field, the meaning is: "the nearest weekday to the 15th of the month". So if the 15th is a
Saturday, the trigger will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the
16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. However if you specify "1W" as the
value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not jump
45
Circulation
over the boundary of a month’s days. The W character can only be specified when the day-of-month is a
single day, not a range or list of days.
The L and W characters can also be combined for the day-of-month expression to yield LW, which
translates to "last weekday of the month".
The # character is allowed for the day-of-week field. This character is used to specify "the nth" XXX day
of the month. For example, the value of "6#3" in the day-of-week field means the third Friday of the month
(day 6 = Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the first Monday of the
month and "4#5" = the fifth Wednesday of the month. Note that if you specify "#5" and there is not 5 of the
given day-of-week in the month, then no firing will occur that month.
The C character is allowed for the day-of-month and day-of-week fields. This character is short-hand for
"calendar". This means values are calculated against the associated calendar, if any. If no calendar is
associated, then it is equivalent to having an all-inclusive calendar. A value of "5C" in the day-of-month
field means "the first day included by the calendar on or after the 5th". A value of "1C" in the day-of-week
field means "the first day included by the calendar on or after sunday".
The legal characters and the names of months and days of the week are not case sensitive.
Here are some full examples:
Expression
Meaning
"0 0 12 * * ?"
Fire at 12pm (noon) every day
"0 15 10 ? * *"
Fire at 10:15am every day
"0 15 10 * * ?"
Fire at 10:15am every day
"0 15 10 * * ? *"
Fire at 10:15am every day
"0 15 10 * * ? 2005"
Fire at 10:15am every day during the year 2005
"0 * 14 * * ?"
Fire every minute starting at 2pm and ending at 2:59pm, every
day
"0 0/5 14 * * ?"
Fire every 5 minutes starting at 2pm and ending at 2:55pm,
every day
"0 0/5 14,18 * * ?"
Fire every 5 minutes starting at 2pm and ending at 2:55pm,
AND fire every 5 minutes starting at 6pm and ending at
6:55pm, every day
"0 0-5 14 * * ?"
Fire every minute starting at 2pm and ending at 2:05pm, every
day
"0 10,44 14 ? 3 WED"
Fire at 2:10pm and at 2:44pm every Wednesday in the month
of March.
"0 15 10 ? * MON-FRI"
Fire at 10:15am every Monday, Tuesday, Wednesday,
Thursday and Friday
"0 15 10 15 * ?"
Fire at 10:15am on the 15th day of every month
"0 15 10 L * ?"
Fire at 10:15am on the last day of every month
"0 15 10 ? * 6L"
Fire at 10:15am on the last Friday of every month
"0 15 10 ? * 6L"
Fire at 10:15am on the last Friday of every month
"0 15 10 ? * 6L 2002-2005"
Fire at 10:15am on every last friday of every month during the
years 2002, 2003, 2004 and 2005
46
ANNEXE 1- Les Expressions Cron
"0 15 10 ? * 6#3"
Fire at 10:15am on the third Friday of every month
Pay attention to the effects of ? and * in the day-of-week and day-of-month fields!
• NOTES: *
• Support for the features described for the C character is not complete.
• Support for specifying both a day-of-week and a day-of-month value is not complete (you’ll need to
use the ? character in on of these fields).
• Be careful when setting fire times between mid-night and 1:00 AM - "daylight savings" can cause a
skip or a repeat depending on whether the time moves back or jumps forward.
47
48

Documents pareils