I. Résumé ♪▲
L'une des fonctionnalités les plus intéressantes introduites par 4D 2003 consiste dans la prise en charge du protocole de service Web SOAP. Il vous est maintenant facile d'interroger ou de publier un service Web depuis 4D. Cette note technique présente les avantages apportés par SOAP dans le cadre des services Web, et décrit la réalisation d'un service Web fondé sur SOAP.
II. Introduction▲
SOAP permet à un client d'exécuter un script, faisant partie du service Web, sur le serveur SOAP. Ce service peut recevoir des paramètres et retourner des résultats. L'exemple classique consiste à proposer la conversion d'un montant d'une monnaie dans une autre. Notre document décrira l'utilisation d'un service Web permettant à une application 4D de retrouver ou mettre à jour des enregistrements dans une autre base 4D.
NDT Généralement cependant les services Web ne travailleront pas au niveau physique, celui des tables et des enregistrements, mais proposeront une couche d'abstraction les situant au niveau métier. Ainsi, permettre d'effectuer une recherche sur la table [CLIENT] pour connaître le montant du champ [CLIENT]Solde impose de connaître le modèle physique des données, ce qui limite l'évolutivité de la solution. Un service Web publiera en général plutôt une fonction Lire Solde Client (identifiant du client).
Il existe plusieurs approches pour la tâche désirée. La plus simple consiste à mettre en œuvre une solution d'import/Export utilisant des échanges de fichiers par email, FTP… Dans ce cas, l'application cible utilise un process en tâche de fond pour récupérer les données.
Une autre approche consiste à exécuter une méthode sur le serveur au moyen d'une requête Web (véhiculée par le protocole HTTP). La balise semi-dynamique 4DACTION ou l'emploi de 4DCGI vous permettent de déclencher l'exécution de code côté serveur HTTP. Mais l'échange de paramètres est limité et vous devez documenter manuellement vos points d'entrée. Il vous revient également de convertir vos types de données en texte pour les insérer dans les requêtes http, puis de les décoder côté serveur.
L'avantage de cette solution est de passer au travers des firewalls sur un port standard, en général le port 80.
Une troisième possibilité repose sur le driver ODBC pour 4D Server ou sur 4D Open pour 4D. Avec 4D Open pour 4D, vous pouvez créer un process, gérer des sélections, et faire à peu près ce que vous voulez. Inconvénients de cette technologie :
- elle est propriétaire, seul un moteur 4D peut se connecter au serveur ;
- seule la connexion à un 4D Server est possible ;
- le port 19813 doit être ouvert sur les firewalls ce qui n'est pas toujours facile à obtenir ;
- il s'agit d'un fonctionnement en mode connecté, sensible au time-out ou aux aléas du réseau. Lorsqu'une connexion est interrompue pour l'une de ces raisons, 4D Server tue le process et perd évidemment le contexte courant ;
- il n'est pas facile d'exécuter des traitements sur le serveur et de récupérer de l'information. Cela vous oblige généralement à redévelopper de la logique applicative côté client 4D Open, ce qui est évidemment regrettable, tant du point de vue du développement, que de la maintenance.
La solution 4D Open pour 4D représente l'approche la plus commune. Cependant, pour que l'application 4D Open puisse mettre à jour un enregistrement, elle doit effectuer les tâches suivantes :
- se connecter à 4D Server ;
- rechercher l'enregistrement ;
- transférer les valeurs mises à jour ;
- demander le stockage de l'enregistrement.
Une autre solution consiste à concevoir une méthode SOAP à laquelle vous pouvez passer des paramètres : pour identifier l'enregistrement et définir les valeurs à mettre à jour. Dans ce cas, l'exécution de code s'effectue côté serveur, contrairement à l'implémentation 4D Open.
Quelle est la différence entre l'approche SOAP et l'appel d'une méthode au travers d'une requête http ? En effet, dans ce dernier cas vous pouvez également passer des paramètres nommés en utilisant un POST ; le process Web reçoit ces paramètres et peut mettre à jour l'enregistrement, puis il peut ou non retourner comme résultat une page HTML, ou bien mieux une structure XML.
Une différence fondamentale est qu'il vous revient d'ouvrir une connexion TCP, construire et envoyer la requête en sérialisant les paramètres, puis attendre le résultat afin de le traiter, désérialiser le résultat et de signaler une éventuelle erreur. Cela demande pas mal de code propriétaire. À l'opposé, la solution SOAP se charge de tout cela au travers d'un protocole standardisé.
Il vous revient simplement d'appeler le service Web avec les paramètres adéquats et de récupérer un éventuel résultat. Tout comme vous le faites avec une méthode locale. Cependant, la solution 4D Open pour 4D présente un avantage. Elle permet de disposer d'un process sur le serveur, avec lequel une connexion reste active, et autorise ainsi à conserver un contexte : sélection, enregistrement courant, variables process. Que ce soit pour une requête SOAP ou HTTP, une fois que le serveur a renvoyé sa réponse, le contexte est perdu. On parle alors de mode déconnecté.
À tout problème sa solution. Les services Web sont pratiques pour envoyer des paramètres et recevoir des résultats. Alors, pourquoi ne pas disposer d'un jeu de méthodes qui se comportent comme 4D Open pour 4D ? L'objectif, bien évidemment, n'étant pas de remplacer 4D Open pour 4D, mais de procurer une alternative crédible.
Nous pouvons déclencher la connexion. Cela crée à l'intérieur de l'application cible un process disposant d'un identifiant unique. Chaque requête SOAP ultérieure devra fournir cet identifiant unique. Chaque méthode du service Web devra vérifier l'identifiant reçu, et retrouver le process avec lequel elle doit communiquer. Comme il s'agit d'un process normal, il demeure toujours actif sur le serveur et peut conserver un contexte, tout comme un process 4D Open. Un autre avantage de cette solution est de vous affranchir de 4D Server. Vous pouvez maintenant vous connecter à tout moteur 4D capable de publier un service Web, c'est-à-dire ayant son serveur Web activé.
III. Le concept▲
Résumons le concept : la base cible servie par 4D ou 4D Server joue le rôle de serveur SOAP (désignée par le nom Serveur). L'application client (également 4D ou 4D Server) joue le rôle de client SOAP (désigné par le nom Client).
Le client désire ouvrir une connexion et exécuter un TOUT SELECTIONNER, puis refermer la connexion.
Voici le code que le Client devra exécuter :
2.
3.
4.
5.
6.
s44D_vTableiD:=
1
proxy_s44D_NewConnection (
s44d_userName;
s44d_password;
s44d_taskName)
proxy_s44D_AllRecords (
s44D_vConnectionID;
s44D_vTableID)
proxy_s44D_CloseConnection (
s44D_vConnectionID)
- s44D_vTableiD est la variable qui contient le n° séquentiel de la table sur laquelle nous désirons exécuter le TOUT SELECTIONNER.
- Le Client demande une connexion au Serveur. Il exécute la méthode proxy_s44D_NewConnection. Il s'agit d'une méthode proxy qui appelle le service Web s44D_NewConnection. Cette méthode a été générée par l'assistant de service Web après analyse du WSDL généré par le Serveur.
- Le Serveur reçoit la requête et le service Web s44D_NewConnection est exécuté. Le service Web crée le nouveau process et lui affecte un ID de session. La méthode utilisée pour ce process est s44D_NewProcess.
La méthode s44D_NewProcess▲
Cette méthode n'est rien de plus qu'un grand Au cas où inclus dans une boucle, le tout accompagné de quelques déclarations de variables. Une fois entré dans la boucle, le code est mis en pause pour éviter de consommer du temps CPU. Si un service Web a besoin d'exécuter une action, il met à jour certaines variables du process, non seulement les paramètres, mais également la variable CodeAction traitée dans le Au cas où.
Ensuite le service Web réveille le process ; le process vérifie la variable CodeAction qui détermine l'action à exécuter. Une fois exécutée, et si l'action demandée n'a pas mis fin au process, celui-ci boucle à nouveau et se met en pause jusqu'à ce que le traitement d'une nouvelle action soit demandé.
Chaque process est créé avec un ID de session qui est stocké dans un tableau interprocess de manière synchronisée avec le numéro du process. L'ID de session est retourné au Client.
- Le Client veut réaliser un TOUT SELECTIONNER. Il appelle la méthode proxy_s44D_AllRecords qui va appeler le service Web s44D_AllRecords. L'ID de session et le n° de table sont passés en paramètres.
- Le service Web vérifie l'ID, puis transmet la requête au process approprié en utilisant ECRIRE VARIABLE PROCESS ou VARIABLE VERS VARIABLE, et réveille le process approprié.
- Le process se réveille et vérifie la variable CodeAction. Au travers du grand Au cas où, l'action souhaitée est trouvée et la commande est exécutée. Un résultat est retourné au service Web. Le process se remet en pause.
- Le service Web reçoit le résultat du process, puis retourne le résultat (ou/et un code d'erreur) au Client.
- Le Client veut refermer la connexion. Il appelle la méthode proxy_s44D_CloseConnection qui va appeler le service Web s44D_CloseConnection. L'ID de session est fournie en paramètre.
- Le service Web vérifie l'ID, et transmet la requête au process approprié, puis réveille ce process.
- Le process se réveille et vérifie la variable CodeAction. En suivant le grand Au cas où, l'action correspondante est trouvée et exécutée. Les résultats sont retournés au service Web et le process meurt.
- Le service web reçoit le résultat du process, l'ID de session est retiré de la liste des Id de session, et le résultat (ou le code d'erreur) est renvoyé au Client.
Installation du composant▲
La base exemple comprend deux composants différents. Le premier contient tout ce qui est relatif au côté serveur. Ce composant doit s'installer dans l'application cible. Un appel à la méthode Compiler_Arrays_Inter est nécessaire à l'ouverture de l'application. Cette méthode contient la déclaration des tableaux synchronisés qui nous permettent de savoir quel process est lié à un identifiant de session.
Le second composant prend en charge le côté Client. Il contient les méthodes proxy d'appel des méthodes publiées par le service Web. La déclaration de chaque variable est également obligatoire : méthodes COMPILER. Vous pouvez également appeler la méthode proxy_InitVariables et changer les valeurs par défaut afin par exemple de définir l'URL du serveur SOAP ou le numéro de port de publication.
Améliorations possibles▲
Ces composants sont fournis en l'état. Comme le code est générique, vous pouvez avoir affaire à des problèmes de performance. Ce code peut ne pas satisfaire complètement vos besoins et vous serez peut-être conduits à le modifier ou à l'optimiser pour votre propre application. L'ajout de nouvelles fonctionnalités est très simple, car tout part de la méthode d'aiguillage s44d_NewProcess.
Par exemple, si vous souhaitez ajouter la commande DEBUT TRANSACTION, il vous suffit d'insérer un nouvel item dans le grand Au cas où de cette méthode, par exemple entre le cas SELECTION VERS TABLEAU et le cas REUNION. Le code de déclenchement pourrait être « DebutTransaction ». Ensuite, vous devrez créer une nouvelle méthode s44d_DebutTransaction qui communiquera avec le nouveau process. La méthode s44D_AllRecords peut servir de modèle. L'étape finale consistera à créer la méthode proxy qui appellera ce nouveau point d'entrée du service Web.
Fonctionnalités▲
Tous les services Web sont fournis avec leurs méthodes proxy. Ces méthodes proxy sont des méthodes génériques qui vous faciliteront l'appel des fonctions.
Voici la liste de tous les services Web opérationnels dans ces composants :
- S44D_AddToSet : cette méthode attend trois paramètres, l'ID de connexion, l'ID de la table, et le nom de l'ensemble. Ce service Web ajoute l'enregistrement courant de la table désignée à l'ensemble cible au moyen de la commande ADJOINDRE ELEMENT. Le code action correspondant est « AddToSet ».
- S44D_AllRecords : cette méthode attend deux paramètres, l'ID de connexion et l'ID de la table. Elle exécute un TOUT SELECTIONNER sur la table désignée. Le code action correspondant est « AllRecords ».
- S44D_ArrayToSelection : cette méthode attend trois paramètres, l'ID de connexion, l'ID de la table, et le BLOB qui contient tous les tableaux. Le service Web décode les tableaux stockés dans le BLOB, puis effectue un TABLEAU VERS SELECTION pour chaque tableau. La limitation de cette fonctionnalité provient du fait que 4D ne supporte pas tous les types de tableaux, par conséquent cette commande ne fonctionne pas pour tous les types de champs. Le code défini dans la méthode s44D_NewProcess pour gérer cette commande peut nécessiter des modifications pour s'adapter à votre structure de données. Le code action correspondant est « ArrayToSelection ».
- S44D_ClearNamedSelection : cette méthode attend deux paramètres, l'ID de connexion et le nom de la sélection temporaire à effacer. Ce service Web exécute la commande EFFACER SELECTION. Le code action correspondant est « ClearNamedSelection ».
- S44D_ClearSet : cette méthode attend deux paramètres, l'ID de connexion et le nom de l'ensemble à effacer. Elle utilise la commande EFFACER ENSEMBLE. Le code action correspondant est « ClearSet ».
- S44D_CloseConnection : cette méthode attend un paramètre, l'ID de connexion. Elle positionne la variable locale $closeProcess à Vrai. Le process courant vérifie si la variable est à Vrai et se termine. Le code action correspondant est « CloseConnection ».
- S44D_CopyNamedSelection : cette méthode attend trois paramètres, l'ID de connexion, l'ID de table et le nom la nouvelle sélection temporaire à créer. Elle crée une sélection temporaire en utilisant la commande COPIER SELECTION. Le code action correspondant est « CopyNamedSelection ».
- S44D_CopySet : cette méthode attend trois paramètres, l'ID de connexion, le nom de l'ensemble source et le nom de l'ensemble cible. Elle utilise la commande COPIER ENSEMBLE. Le code action correspondant est « CopySet ».
- S44D_CountTables : cette méthode attend un paramètre, l'ID de connexion. Elle retourne le nombre de tables en appelant la fonction Nombre de tables. Cette méthode n'interagit pas avec le process désigné. C'est pourquoi il n'y a pas de code action correspondant.
- S44D_CreateSet : cette méthode attend trois paramètres, l'ID de connexion, l'ID de table et le nom du nouvel ensemble. Elle crée un nouvel ensemble en appelant la commande CREER ENSEMBLE sur la sélection courante. Le code action correspondant est « CreateSet ».
- S44D_CutNamedSelection : cette méthode attend trois paramètres, l'ID de connexion, l'ID de table et le nom de la nouvelle sélection temporaire à créer. Elle déplace la sélection courante vers une nouvelle sélection temporaire en utilisant la commande DEPLACER SELECTION. Le code action correspondant est « CutNamedSelection ».
- S44D_DeleteRecord : cette méthode attend deux paramètres, l'ID de connexion et l'ID de table. Elle supprime l'enregistrement courant de la table cible en appelant la commande SUPPRIMER ENREGISTREMENT. Le code action correspondant est « DeleteRecord ».
- S44D_DeleteSelection : cette méthode attend deux paramètres, l'ID de connexion et l'ID de table. Ce service Web supprime la sélection courante de la table cible en appelant la commande SUPPRIMER SELECTION. Le code action correspondant est « DeleteSelection ».
- S44D_Difference : cette méthode attend quatre paramètres, l'ID de connexion et trois noms d'ensembles. Le service Web créé un nouvel ensemble à partir des deux premiers ensembles passés en appelant la commande DIFFERENCE. Le code action correspondant est « Difference ».
- s44D_FirstRecord : cette méthode attend deux paramètres, l'ID de connexion et l'ID de table. Elle exécute la commande DEBUT SELECTION sur la table cible. Le code action correspondant est « FirstRecord ».
- S44D_FlusBuffers : cette méthode attend un paramètre, l'ID de connexion. Elle exécute ECRIRE CACHE. Cette méthode n'interagit pas avec le process désigné. C'est pourquoi il n'existe pas de code correspondant.
- S44D_GetAllTableNames : cette méthode attend un paramètre, l'ID de connexion. Elle retourne un tableau de tous les noms de table obtenus par la fonction Nom de la table. Cette méthode n'interagit pas avec le process désigné. C'est pourquoi il n'existe pas de code correspondant.
- S44D_GetTableProperties : cette méthode attend deux paramètres, l'ID de connexion et l'ID de la table. Elle retourne différents tableaux et variables qui décrivent la table et la liste des champs. Elle utilise les commandes LIRE PROPRIETES CHAMP, LIRE PROPRIETES SAISIE CHAMP. Cette méthode n'interagit pas avec le process désigné. C'est pourquoi il n'existe pas de code correspondant.
- S44D_GoToSelectedRecord : cette méthode attend trois paramètres, l'ID de connexion, l'ID de la table et le numéro de l'enregistrement à atteindre. Elle exécute la commande ALLER DANS SELECTION sur la table désignée. Le code action correspondant est « GotoSelectedRecord ».
- S44D_Intersection : cette méthode attend quatre paramètres, l'ID de connexion et les trois noms d'ensembles requis par la commande. Elle crée un nouvel ensemble à partir des deux premiers ensembles passés en paramètre en appelant la commande INTERSECTION. Le code action correspondant est « Intersection ».
- S44D_IsInSet : cette méthode attend trois paramètres, l'ID de connexion, l'ID de table et le nom de l'ensemble. Elle retourne un booléen indiquant si l'enregistrement courant de la table désignée est membre de l'ensemble cible. Elle utilise la fonction Appartient a ensemble. Le code correspondant est « IsInSet ».
- S44D_LastRecord : cette méthode attend deux paramètres, l'ID de connexion et l'ID de la table. Elle exécute la commande ALLER A DERNIER ENREGISTREMENT sur la table cible. Le code action correspondant est « LastRecord ».
- s44D_LoadRecord : cette méthode SOAP attend deux paramètres, l'ID de connexion et l'ID de table cible. Elle exécute la commande CHARGER ENREGISTREMENT sur la table désignée. Une fois l'enregistrement chargé, le contenu de l'enregistrement est stocké dans une variable BLOB en utilisant la commande VARIABLE VERS BLOB. Le code action correspondant est « LoadRecord ».
- S44D_NewConnection : cette méthode SOAP attend 3 paramètres, un nom d'utilisateur, un mot de passe et un nom de tâche. C'est dans cette méthode que vous pouvez authentifier l'utilisateur courant. Vous pouvez accepter ou refuser de créer une nouvelle connexion. Dans le cas d'un refus, vous pouvez retourner l'un des codes d'erreur proposés. En cas d'acceptation, vous pouvez créer le process et mettre à jour les tableaux interprocess qui listent les ID de connexions valides et les ID de leur process. Le code action correspondant est « NewConnexion ».
- S44D_NewRecord : cette méthode attend trois paramètres, l'ID de connexion, l'ID de table et l'enregistrement stocké dans une variable BLOB. Elle relit toutes les valeurs depuis le BLOB et crée un nouvel enregistrement contenant ces valeurs pour la table désignée. Le code action correspondant est « NewRecord ».
- S44D_NextRecord : cette méthode attend deux paramètres, l'ID de connexion et l'ID de la table cible. Elle exécute la commande ENREGISTREMENT SUIVANT sur la table désignée. Le code correspondant est « NextRecord ».
- S44D_OrderBy : cette méthode attend cinq paramètres, l'ID de connexion, l'ID de table devant être triée, les ID des champs à trier et les ID de leur table d'appartenance, plus le sens du tri. Elle exécute la commande TRIER sur la table cible. Les trois derniers paramètres sont des tableaux. Le tableau des sens de tri doit contenir le caractère '<' ou '>'. Le code action correspondant est « OrderBy ».
- S44D_PreviousRecord : cette méthode attend deux paramètres, l'ID de connexion et l'ID de table. Elle exécute la commande ENREGISTREMENT PRECEDENT sur la table désignée. Le code action correspondant est « PreviousRecord ».
- S44D_Query : cette méthode attend trois paramètres, l'ID de connexion, l'ID de la table cible et un BLOB qui contient les champs et les valeurs à rechercher. Elle ne requiert aucun tableau, car ceux-ci sont contenus dans le BLOB passé en paramètre. Ceci afin de montrer que le BLOB peut servir dans les deux sens. La variable BLOB contient deux tableaux d'entiers longs et un tableau texte. Le tableau d'ID de champs définit les champs à utiliser, le tableau des opérateurs définit les conditions (1 pour =, 2 pour #, 3 pour >, 4 pour >=, 5 pour <, 6 pour <=) et le tableau texte détermine les valeurs à rechercher. Cette méthode construit une requête exécutée par la commande CHERCHER sur la table cible. Le code action correspondant est « Query ».
- S44D_RecordsInSelection : cette méthode attend deux paramètres, l'ID de connexion et l'ID de table. Elle retourne le nombre d'enregistrements de la sélection courante de la table désignée en appelant la fonction Enregistrements trouves. Le code action correspondant est « RecordsInSelection ».
- s44D_RecordsInSet : cette méthode attend deux paramètres, l'ID de connexion et le nom de l'ensemble. Elle retourne le nombre d'enregistrements de l'ensemble cible en appelant la fonction Enregistrements dans ensemble. Le code action correspondant est « RecordsInSet ».
- S44D_RecordsinTable : cette méthode attend deux paramètres, l'ID de connexion et l'ID de table. Elle retourne le nombre total d'enregistrements de la table cible en appelant la fonction Enregistrements dans table. Le code action correspondant est « RecordsInTable ».
- S44D_ReduceSelection : cette méthode attend trois paramètres, l'ID de connexion, l'ID de la table et le nombre d'enregistrements de la sélection. Elle réduit la sélection courante de la table désignée au nombre spécifié en paramètre en appliquant la commande REDUIRE SELECTION. Le code action correspondant est « ReduceSelection ».
- S44D_RemoveFromSet : cette méthode attend trois paramètres, l'ID de connexion, l'ID de table et le nom de l'ensemble. Elle retire l'enregistrement courant de la table désignée de l'ensemble cible en appliquant la commande ENLEVER ELEMENT. Le code action correspondant est « RemoveFromSet ».
- S44D_SelectionToArray : cette méthode attend deux paramètres, l'ID de connexion et l'ID de la table. Elle crée un tableau pour chaque champ utilisable et sauve ces tableaux dans une variable BLOB. Cette variable BLOB est retournée au client proxy qui relit les tableaux. La commande principale utilisée est SELECTION VERS TABLEAU. Le code action correspondant est « SelectionToArray ».
- S44D_Union : cette méthode attend trois paramètres, l'ID de connexion et les trois noms d'ensemble requis pour l'exécution. Elle crée un nouvel ensemble à partir des deux premiers passés en paramètre en utilisant la commande REUNION. Le code action correspondant est « Union ».
- S44D_UnloadRecord : cette méthode attend deux paramètres, l'ID de connexion et l'ID de table. Elle exécute LIBERER ENREGISTREMENT sur la table désignée. Le code action correspondant est « UnloadRecord ».
- S44D_UpdateRecord : cette méthode attend trois paramètres, l'ID de connexion, l'ID de la table et l'enregistrement stocké dans un BLOB. Elle relit toutes les valeurs depuis le BLOB, met à jour puis sauvegarde l'enregistrement existant avec ces valeurs en se basant sur l'ID de table. Le code action correspondant est « UpdateRecord ».
- S44D_UsenamedSelection : cette méthode attend deux paramètres, l'ID de connexion et le nom de la sélection temporaire. Elle exécute la commande UTILISER SELECTION avec le nom passé en paramètre. Le code action correspondant est « UsenamedSelection ».
- s44D_UseSet : cette méthode attend deux paramètres, l'ID de connexion et le nom de l'ensemble à utiliser. Elle exécute la commande UTILISER ENSEMBLE sur l'ensemble passé en paramètre. Le code action correspondant est « UseSet ».
Base exemple▲
Comme vous pouvez le constater, cette application contient à la fois le code source du côté client et serveur. Elle contient également une interface permettant de tester toutes les fonctions implémentées. Cependant, le seul objectif de cette interface est d'illustrer les principes décrits ici. Lors d'une sélection de l'item Démarrer du menu Démo, un dialogue contenant deux onglets s'affiche. Vous pouvez cliquer sur « Lire information » pour retrouver la liste courante des tables. Depuis la liste des tables, vous pouvez sélectionner une table pour récupérer la liste courante des champs définis pour cette table.
Le second onglet ne fait rien d'autre que créer quelques enregistrements, et les mettre à jour, ou jouer avec des sélections nommées, des ensembles, et ainsi de suite. Vous pouvez regarder le code source de ces scripts pour voir comment chacun de ces services Web peut être invoqué.
L'approche utilisée dans ce composant est identique à celle utilisée pour le plug-in 4D Open pour 4D. Lors de l'utilisation de ce composant, conservez seulement à l'esprit qu'après chaque appel, il est recommandé de vérifier les paramètres retournés ou tout code d'erreur, comme lors de l'utilisation de n'importe quel plug-in 4D. Pensez également qu'aucun de ces process ne se terminera par un time out. Vous aurez peut-être à implémenter votre propre système de time out si vous ne voulez pas de process fonctionnant indéfiniment sur votre serveur.
Le moyen le plus simple pour le mettre en place consiste à assigner un time stamp à une variable juste avant de mettre en pause le process dans la méthode s44D_NewProcess, puis d'utiliser un process en tâche de fond qui vérifiera cette variable pour tous les process et réveillera les process à terminer en leur passant la requête CloseConnection. Les tableaux interprocess sont également à mettre à jour pour refléter ce changement.
IV. En résumé▲
Ce code générique peut représenter une approche novatrice pour les développeurs qui souhaitent gérer des enregistrements entre des applications 4D. Cependant, conservez à l'esprit que l'objectif de cette note technique n'est pas de remplacer 4D Open pour 4D, mais de proposer une alternative, chaque technologie présentant ses avantages et ses inconvénients…
Gardez également présent à l'esprit, qu'en dépit de l'orientation multiplateforme de SOAP, ce service Web n'est consommable que par des clients 4D, les objets manipulés étant liés au langage propriétaire de 4D.
V. Bases exemples▲
Téléchargez les bases exemples :
base exemple Mac
base exemple Windows