Produit à partir de l'analyse du code source des orchestrations, schémas et liaisons de ports dansSTM.ICUTexto.EAIetSTM.ICUTextoExtraction.EAI. Horodatage du fichier de liaisons de ports : 2015-10-14. Nom de l'application dans les liaisons :STM.ICUTexto.EAI.
Cette application BizTalk constitue la couche d'intégration du canal SMS ICU (Information Clientèle Urgence) de la STM, nommé en interne « Texto ». Elle gère :
DeliveryReport) et persistance des résultats dans la base de données SQL ICU./inbound) et acheminement en tant que MessageUsagerEntrant.STM.ICUTextoExtraction.EAI) extrait les enregistrements SMS du schéma SQL icuextraction et les publie en aval.| Système | Rôle | Protocole / Transport |
|---|---|---|
| Vudu (fournisseur SMS) | Passerelle SMS pour l'envoi unitaire, l'envoi en lot, le statut de diffusion, la récupération de flux | WCF-WebHttp (HTTPS), application/x-www-form-urlencoded sortant, réponse JSON entrante |
| Base de données SQL ICU | Magasin de persistance pour les enregistrements d'envoi SMS, le suivi des lots, les mises à jour de statut, la purge | WCF-SQL (adaptateur SQL BizTalk), procédures stockées |
| Appelants internes | Envoi de requêtes SMS à BizTalk via HTTP REST | Emplacement de réception WCF-WebHttp, authentification Basic sur TLS |
| Webhook entrant Vudu | Livraison des messages SMS entrants (MO) à BizTalk | Emplacement de réception WCF-WebHttp, authentification Basic sur TLS |
| SSPO / base de données icuextraction | Source des données d'extraction SMS pour le traitement en aval | WCF-SQL (procédure typée selExtractionTexto_SPPO) |
| Nom du port | Adresse | Transport | Méthode | Pipeline | Notes |
|---|---|---|---|---|---|
STM.ICUTexto.EAI_EnvoiTexto |
/icutexto/api.svc |
WCF-WebHttp | POST /texto |
Rcv_Json (désérialisation JSON) |
MaxConcurrentCalls=200, MaxReceivedMessageSize=204800, Auth : Basic sur TLS, AuthorizationManager personnalisé |
STM.ICUTexto.EAI_ReceptionVudu |
/icutexto/vudu/api.svc |
WCF-WebHttp | POST /inbound |
Rcv_JsonPromote |
MaxConcurrentCalls=200, Auth : Basic sur TLS, transformation vuduInbound2MessageUsagerEntrant |
STM.ICUTexto.EAI_PollTraitementSmsBroadcast |
${IcuDbAdress} InboundId=SmsBroadcast |
WCF-SQL TypedPolling | — | XMLReceive | Interroge dbo.PollTraitementSMSBroadcast avec intervalle configurable (${IntervalPollingBroadcast}) et nombre maximum de lignes (${MaxPollingBroadcast}) |
STM.ICUTexto.EAI_PollTraitementSmsFeed |
${IcuDbAdress} InboundId=SmsFeed |
WCF-SQL TypedPolling | — | XMLReceive | Interroge dbo.PollTraitementSMSFeed avec intervalle configurable (${IntervalPollingFeed}) et nombre maximum de lignes (${PoolingFeedNbrRow}) |
STM.ICUTexto.EAI_PurgerTraitementTexto |
Planification (quotidienne) | Adaptateur Schedule | — | Rcv_Nullify |
Se déclenche quotidiennement à 03:00, exécute exec PurgerTraitementTexto 100 via connexion ADO ${IcuDbAdoAdress} |
| Nom du port | Adresse | Transport | Opérations | Notes |
|---|---|---|---|---|
STM.ICUTexto.EAI_vuduSend |
${uriFournisseur} |
WCF-WebHttp HTTPS | POST /send, POST /send_batch, POST /get_broadcast |
Pipeline : Snd_wwwFormEncoded (encodage formulaire) / Rcv_Json (réponse JSON). TLS + inspecteur STM.WCFHttpHeaderBehavior.EAI. RetryCount=0. RouteFailedMessage=true |
STM.ICUTexto.EAI_vuduSendbatch |
${uriFournisseur} |
WCF-WebHttp HTTPS | POST /send_batch |
Même ensemble de pipelines. RetryCount=0. RouteFailedMessage=true |
STM.ICUTexto.EAI_vuduGetBroadcast |
${uriFournisseur} |
WCF-WebHttp HTTPS | POST /get_broadcast |
RetryCount=0 |
STM.ICUTexto.EAI_vuduGetFeed |
${uriFournisseur} |
WCF-WebHttp HTTPS | POST /get_feed |
RetryCount=3 |
STM.ICUTexto.EAI_SQLTraitementSms |
${IcuDbAdress} |
WCF-SQL | SauvegarderTraitementSMS, CreerTraitementSMSBatch, UpdTraitementSMSBatch |
Unidirectionnel. IsolationLevel=Serializable, livraison ordonnée |
STM.ICUTexto.EAI_SQLTraitementSmsResponse |
${IcuDbAdress} |
WCF-SQL | updFeed, updBroadcast |
Bidirectionnel. IsolationLevel=Serializable |
STM.ICUTexto.EAI_ResultatExecution |
${RepertoireArchive}\Out\%MessageID%.xml |
FILE | — | Filtre : MessageType = ResultatExecution ET Medium = Texto. Pipeline : Snd_Nullify |
STM.ICUTexto.EAI_Erreur |
${RepertoireArchive}\%datetime%_%MessageID%.xml |
FILE | — | Archive d'erreurs. Capture les messages en échec provenant des ports de réception vuduSend, vuduSendbatch, ReceptionClx, ReceptionVudu |
Tous les ports d'envoi WCF-WebHttp Vudu utilisent SecurityMode=Transport, TransportClientCredentialType=None, avec STM.WCFHttpHeaderBehavior.EAI.Inspector (comportement WCF personnalisé de point de terminaison qui injecte un en-tête HTTP Authorization) et STM.TLSEndpointBehavior.EAI (TLS mutuel). Le jeton d'autorisation est récupéré à l'exécution par EnvoyerSMSVuduHelper.ObtenirHeader() et DemanderStatusHelper.ObtenirHeaderAuthorization(Source).
STM.ICUTexto.EAI.EnvoiSMS.EnvoyerSMS)Module : STM.ICUTexto.EAI.EnvoiSMS
Fichier : EnvoyerSMS.odx
Activée par un message de type STM.ICUSchema.EAI.Schema.MessageUsager.Texto arrivant sur MessageUsagerTextoPort (DirectBinding — MessageBox). Ce message provient de l'orchestration Mediator qui reçoit le POST HTTP entrant sur /icutexto/api.svc/texto.
MessageUsagerTexto (activation).messageErreur, IdMessage, Source, Contenu, EnteteTexto, numero, indBatch=false, Statut="".Decide_VerifierFiltreDestinataireRule_VerifierFiltreDestinataire (EnvoyerSMSHelper.VerifierFiltreDestinataire(MessageUsagerTexto) == true) :Decide_VerifierTextoValideRule_VerifierTextoValide (EnvoyerSMSHelper.VerifierTextoValide(MessageUsagerTexto, out messageErreur) == true) :EnvoyerSMSVudu(MessageUsagerTexto) — effectue l'envoi réel vers Vudu.MessageResultatExecution = EnvoyerSMSHelper.CreerResultatExecutionSucces(MessageUsagerTexto).Contenu, IdMessage, Source via XPath ; appel de ObtenirEnteteTexto, ObtenirLesNumeros.Statut = "ERREUR", broadcastId = -1, msgId = -1.SauvegarderDetailsEnvoi(msgId, IdMessage, Source, EnteteTexto, numero, broadcastId, Contenu, messageErreur, indBatch, Statut).MessageResultatExecution = EnvoyerSMSHelper.CreerResultatExecutionErreur(...).Logger.LogErreur(MESSAGE_INFO, messageErreur).Statut = "FILTRE", broadcastId = -1, msgId = -1, messageErreur = "".SauvegarderDetailsEnvoi(...).MessageResultatExecution = EnvoyerSMSHelper.CreerResultatExecutionFiltre(MessageUsagerTexto).MessageResultatExecution sur ResultatExecutionPort (DirectBinding — MessageBox). Ce message est finalement acheminé vers le port d'envoi FILE STM.ICUTexto.EAI_ResultatExecution.SauvegarderDetailsEnvoi avec Statut="ERREUR".Statut="FILTRE" (aucune journalisation d'erreur).STM.ICUSchema.EAI.Schema.MessageUsager.Texto — message entrantSTM.ICUSchema.EAI.Schema.ResultatExecution — résultat sortant (filtré vers FILE via http://www.stm.info/namespaces/internal/icu/resultatexecution/1#ResultatExecution)STM.ICUTexto.EAI.EnvoiSMS.EnvoyerSMSVudu)Module : STM.ICUTexto.EAI.EnvoiSMS
Fichier : EnvoyerSMSVudu.odx
IsInvokable : true (appelée de façon synchrone par EnvoyerSMS)
Appelée par l'orchestration parente avec le paramètre MessageUsagerTexto (type STM.ICUSchema.EAI.Schema.MessageUsager.Texto).
DEBUT_TRAITEMENT_INFO.Contenu, IdMessage, Source via XPath ; appel de ObtenirEnteteTexto, ObtenirNombreDeDestinataire.indBatch = (nbDestinataires != 1), nbEnvoi = ObtenirNombreDeTextoAEnvoyer(nbDestinataires), idxEnvoi = 0.Decide_NombreDestinataires Branche Rule_Unique (nbDestinataires == 1) : Chemin destinataire unique
Scope_Send (atomique) :msgVuduSmsSend (schéma : STM.ICUTexto.EAI.EnvoiSMS.Schema.vuduSmsSend, espace de noms https://www.stm.info/icu/texto/vudu/send) :msgVuduSmsSend = EnvoyerSMSVuduHelper.ObtenirSendSmsMessage(MessageUsagerTexto)STM.WCFHttpHeaderBehavior.EAI.Schema.value = ObtenirHeader() (injection de l'en-tête Auth)BTS.Operation = "send"numeros depuis //*[local-name()='to'] dans msgVuduSmsSend.msgVuduSmsSend sur vuduSendSmsPort → STM.ICUTexto.EAI_vuduSend → Vudu POST /sendmsgVuduSmsSendResponse (schéma : vuduSmsSendResponse, espace de noms https://www.stm.info/icu/texto/vudu/send/response).status (boolean + attribut type), status_detail (string + attribut type), msg_id (unsignedShort + attribut type).numeros, msgId, statusDetail depuis la réponse via le helper.erreur = "".SauvegarderDetailsEnvoi(msgId, IdMessage, Source, EnteteTexto, numeros, broadcastId=-1, Contenu, erreur, indBatch, statusDetail).System.Exception dans la portée :SYSTEM_EXCEPTION_ERREUR avec ex.ToString().erreur = ex.ToString(), msgId = -1, broadcastId = -1, statusDetail = "ERREUR".SauvegarderDetailsEnvoi(...) avec les valeurs d'erreur.Sinon (chemin multi-destinataires / lot) :
msgCreerTraitementSMSBatch (schéma : CreerTraitementSMSBatch, espace de noms http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/dbo) :idMessage = IdMessage, nbEnvois = nbEnvoiCreerTraitementSMSBatchPort → STM.ICUTexto.EAI_SQLTraitementSms (procédure stockée CreerTraitementSMSBatch).CreerTraitementSMSBatchResponse (retourne ReturnValue: int).broadcastId depuis la réponse via le helper.while idxEnvoi < nbEnvoi) :Scope_SendBatch (atomique) par itération :msgVuduSmsSendBatch (schéma : vuduSmsSendBatch, espace de noms https://www.stm.info/icu/texto/vudu/sendBatch), champs : to (token), message (string).BTS.Operation = "vuduSendBatchSms", en-tête Auth.vuduSendBatchSmsPort → STM.ICUTexto.EAI_vuduSendbatch → Vudu POST /send_batchmsgVuduSmsSendBatchResponse.SauvegarderDetailsEnvoi(...) avec les résultats par lot.System.Exception : journalisation, statut mis à "ERREUR", appel de SauvegarderDetailsEnvoi.idxEnvoi.System.Exception — les échecs sont enregistrés individuellement par destinataire/entrée de lot, non propagés vers le haut.indBatch distingue les entrées unitaires des entrées en lot dans la couche de persistance SQL.vuduSend/vuduSendbatch : RetryCount=0 — aucun réessai automatique au niveau BizTalk. Les échecs sont capturés dans le bloc catch et persistés avec statusDetail="ERREUR".STM.ICUTexto.EAI.EnvoiSMS.Schema.vuduSmsSend (https://www.stm.info/icu/texto/vudu/send) : { to: token, message: string }STM.ICUTexto.EAI.EnvoiSMS.Schema.vuduSmsSendResponse (https://www.stm.info/icu/texto/vudu/send/response) : { status: boolean+type, status_detail: string+type, msg_id: unsignedShort+type }STM.ICUTexto.EAI.EnvoiSMS.Schema.vuduSmsSendBatch (https://www.stm.info/icu/texto/vudu/sendBatch) : { to: token, message: string }STM.ICUTexto.EAI.EnvoiSMS.Schema.TypedProcedure_dbo.CreerTraitementSMSBatch (adaptateur SQL) : { idMessage: string(50), nbEnvois: int } → retourne ReturnValue: intSTM.ICUTexto.EAI.EnvoiSMS.Schema.TypedProcedure_dbo.SauvegarderTraitementSMS (adaptateur SQL) : { numeros: ArrayOfTypeNumeros, idMessage: string(100), indBatch: boolean, statutDetail: string(20), enteteTexto: string, source: string(100), broadcastId: int, msgId: int, from: string(50), message: string, erreur: string }Module : STM.ICUTexto.EAI.EnvoiSMS
Déclarée dans les liaisons de ports comme STM.ICUTexto.EAI.EnvoiSMS.SauvegarderDetailsEnvoi, liée à SauvegarderTraitementSMSPort → STM.ICUTexto.EAI_SQLTraitementSms.
Persiste l'enregistrement d'envoi SMS dans la base de données SQL ICU en appelant la procédure stockée dbo.SauvegarderTraitementSMS. Invoquée de façon synchrone par EnvoyerSMS (pour les chemins filtre/erreur) et par EnvoyerSMSVudu (pour les chemins succès et exception).
msgId: int, IdMessage: string, Source: string, EnteteTexto: string, numero: string, broadcastId: int, Contenu: string, messageErreur: string, indBatch: boolean, Statut: string
STM.ICUTexto.EAI.ObtiensStatus.DemanderStatus)Module : STM.ICUTexto.EAI.ObtiensStatus
Fichier : DemanderStatus.odx
Activée par un message DemanderStatusSchema sur ObtenirStatusPort (DirectBinding — MessageBox). Ce message est publié par l'orchestration MettreAJourStatus (voir Flux 5).
MessageDemanderStatus (activation).Scope_DemanderFullDeliveryReport :BatchId = "", Source = "".BatchId depuis string(//*[local-name()='batchId']), Source depuis string(//*[local-name()='source']).MessageDeliveryReport (System.Xml.XmlDocument) :.STM.ICUTexto.EAI.ObtiensStatus.Schema.BatchId = BatchIdSTM.ICUTexto.EAI.ObtiensStatus.Schema.ServicePlanId = DemanderStatusHelper.ObtenirServicePlanId(Source)STM.ICUTexto.EAI.ObtiensStatus.Schema.AuthToken = DemanderStatusHelper.ObtenirAuthorizationToken(Source)STM.WCFHttpHeaderBehavior.EAI.Schema.value = DemanderStatusHelper.ObtenirHeaderAuthorization(Source)MessageDeliveryReport sur DeliveryReportPort (requête-réponse, LogicalBinding → lié au déploiement, présumément vers STM.ICUTexto.EAI_vuduGetBroadcast → Vudu POST /get_broadcast).MessageDeliveryReportReponse (schéma : STM.ICUTexto.EAI.ObtiensStatus.Schema.ClxFullDeliveryReport).SauvegarderStatus(MessageDeliveryReportReponse, BatchId).System.Exception Ex :Logger.LogErreur(SYSTEM_EXCEPTION_ERREUR, Ex.Message) — l'erreur est absorbée ; aucun renvoi.STM.ICUTexto.EAI.ObtiensStatus.Schema.DemanderStatusSchema — message déclencheur avec batchId et sourceSystem.Xml.XmlDocument — XML générique utilisé comme requête vers Vudu (les propriétés promues portent les valeurs réelles)STM.ICUTexto.EAI.ObtiensStatus.Schema.ClxFullDeliveryReport — réponse du rapport de livraison VuduSchema.BatchId, Schema.ServicePlanId, Schema.AuthToken (de DemanderStatusProperty.xsd)STM.ICUTexto.EAI.ObtiensStatus.MettreAJourStatus)Module : STM.ICUTexto.EAI.ObtiensStatus
Fichier : MettreAJourStatus.odx
Activée par un message TypedPolling_ObtenirClxTextoStatus.TypedPolling arrivant sur PollingTraitementStatusPort (DirectBinding — MessageBox). Ceci est piloté par les emplacements de réception WCF-SQL TypedPolling (STM.ICUTexto.EAI_PollTraitementSmsBroadcast ou STM.ICUTexto.EAI_PollTraitementSmsFeed).
Le schéma du message d'interrogation est http://schemas.microsoft.com/Sql/2008/05/TypedPolling/SmsBroadcast avec l'élément TypedPolling → TypedPollingResultSet0[] → chaque ligne contenant BroadcastId: int. La procédure stockée interrogée est dbo.PollTraitementSMSBroadcast.
MsgPollingStatus (activation).nbRecord = count(//*[local-name()='ClxBatchId']), idxRecord = 1.MessageMAJTraitementTexto (schéma : TypedProcedure_dbo.MettreAJourTraitementTexto) via MettreAJourStatusHelper.ObtenirMettreAJourTraitementTexto(MsgPollingStatus, 1).MessageMAJTraitementTexto sur MettreAJourTraitementTextoPort (LogicalBinding, DeliveryNotification=Transmitted) → lié à STM.ICUTexto.EAI_SQLTraitementSms (procédure stockée UpdTraitementSMSBatch).while idxRecord <= nbRecord) :Scope_DemanderStatus (atomique) :MsgDemanderStatus (schéma : DemanderStatusSchema) :MsgDemanderStatus = MettreAJourStatusHelper.ObtenirDemanderStatusMessage(idxRecord, MsgPollingStatus)STM.ICUTexto.EAI.ObtiensStatus.Schema.QueueId = MettreAJourStatusHelper.ObtenirQueueId(idxRecord)MsgDemanderStatus sur DemanderStatusPort (DirectBinding — MessageBox) — publié dans le MessageBox pour que l'orchestration DemanderStatus le récupère.idxRecord.STM.ICUTexto.EAI.ObtiensStatus.Schema.TypedPolling_ObtenirClxTextoStatus.TypedPolling — résultat de l'interrogation SQLSTM.ICUTexto.EAI.ObtiensStatus.Schema.TypedProcedure_dbo.MettreAJourTraitementTexto — appel de procédure stockée SQLSTM.ICUTexto.EAI.ObtiensStatus.Schema.DemanderStatusSchema — message transmis à l'orchestration DemanderStatusSTM.ICUTextoExtraction.EAI.Extraction.ExtraireSSPO)Module : STM.ICUTextoExtraction.EAI.Extraction
Fichier : ExtraireSSPO.odx
Application : STM.ICUTextoExtraction.EAI (application BizTalk distincte)
Activée par un message Schema.declencheur sur declencheurPort (DirectBinding — MessageBox). Il s'agit d'un message déclencheur/planificateur.
msgDeclencheur (activation).DEBUT_TRAITEMENT_INFO.msgSelExtractionTexto_SPPO (schéma : TypedProcedure_icuextraction.selExtractionTexto_SPPO, espace de noms http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/icuextraction) :listeSource = ExtraireSSPOHelper.ObtenirSource()oneShot = ExtraireSSPOHelper.EstOneShot(msgDeclencheur)msgSelExtractionTexto_SPPO sur selExtractionTexto_SPPOPort (LogicalBinding, requête-réponse) → appel de la procédure stockée icuextraction.selExtractionTexto_SPPO.msgSelExtractionTexto_SPPOResponse (schéma : selExtractionTexto_SPPOResponse).msgExtractionSPPO (schéma : Schema.extractionSPPO) en utilisant la carte BizTalk selExtractionTexto_SPPO2extractionSPPO appliquée à la réponse.msgExtractionSPPO sur ExtractionSPPOPort (DirectBinding — MessageBox) — publication des données extraites pour consommation en aval.FIN_TRAITEMENT_INFO.STM.ICUTextoExtraction.EAI.Extraction.Schema.declencheur — déclencheurSTM.ICUTextoExtraction.EAI.Extraction.Schema.TypedProcedure_icuextraction.selExtractionTexto_SPPO — requête de procédure stockée SQLSTM.ICUTextoExtraction.EAI.Extraction.Schema.TypedProcedure_icuextraction.selExtractionTexto_SPPOResponse — réponse de procédure stockée SQLSTM.ICUTextoExtraction.EAI.Extraction.Schema.extractionSPPO — sortie transforméeDemanderStatusHelper.ObtenirAuthorizationToken(Source), ObtenirHeaderAuthorization(Source) et EnvoyerSMSVuduHelper.ObtenirHeader() récupèrent les identifiants à l'exécution depuis le code helper — probablement en lisant depuis le SSO BizTalk ou des fichiers de configuration. Le mécanisme est opaque et non externalisé vers un magasin de secrets. La rotation des identifiants Vudu nécessite un redéploiement ou une reconfiguration SSO.
STM.ICUTexto.EAI_vuduSend et STM.ICUTexto.EAI_vuduSendbatch ont RetryCount=0. Les échecs HTTP transitoires entraînent une capture d'exception immédiate dans la portée de l'orchestration, qui affecte statusDetail="ERREUR" et persiste en SQL — mais ne réessaie pas l'envoi. Si l'API Vudu est temporairement indisponible, les messages sont marqués comme échoués de manière permanente sans mécanisme de remise en file.
Le gestionnaire Catch_All dans DemanderStatus journalise l'erreur, mais complète l'orchestration normalement. Les échecs d'interrogation du statut de livraison (p. ex. Vudu retourne 5xx, délai d'attente réseau) sont invisibles pour les opérations, sauf par l'analyse des journaux.
Tout échec dans la boucle de mise à jour du statut (erreur SQL, erreur réseau) suspend l'instance complète de l'orchestration de lot d'interrogation dans BizTalk. Tous les enregistrements restants dans le lot interrogé ne sont pas traités tant que l'instance n'est pas manuellement reprise ou terminée.
Les enregistrements sont traités un à la fois (while idxRecord <= nbRecord). Pour les lots d'interrogation volumineux, cela crée un goulot d'étranglement de traitement linéaire. BizTalk ne parallélise pas cette boucle.
L'orchestration d'extraction n'a aucune gestion d'exception. Un délai d'attente SQL ou une base de données icuextraction indisponible suspend l'instance de manière permanente.
STM.ICUTexto.EAI_ResultatExecution écrit les résultats d'exécution dans le système de fichiers (${RepertoireArchive}\Out\). Il s'agit d'un patron de dépôt sans accusé de réception, sans TTL, sans nettoyage. Le disque se remplit s'il n'est pas géré.
STM.ICUTexto.EAI_Erreur archive les messages en échec dans ${RepertoireArchive}\%datetime%_%MessageID%.xml. Mêmes préoccupations que ci-dessus.
${uriFournisseur}, ${IcuDbAdress}, ${IcuDbAdoAdress}, ${RepertoireArchive}, ${BtsProcessingHostInstance}, ${IntervalPollingBroadcast}, ${MaxPollingBroadcast}, etc. sont des variables de substitution au déploiement. Leurs valeurs réelles ne sont pas dans le code analysé ; les valeurs doivent être obtenues à partir des scripts de déploiement BizTalk ou de la configuration d'environnement.
STM.ICUTexto.EAI.ObtiensStatus.MettreAJourFeed est listé dans les liaisons de ports avec State="Unenlisted", suggérant que le chemin de statut basé sur le flux a été désactivé ou n'a jamais été mis en production. L'emplacement de réception du flux d'interrogation (STM.ICUTexto.EAI_PollTraitementSmsFeed) est présent dans les liaisons, mais l'orchestration consommatrice n'est pas en cours d'exécution.
Les pipelines JSON entrants et sortants utilisent des composants personnalisés STM.JsonAssembler.EAI.PipelineComponents.JsonDisassembler et STM.ICUTexto.EAI.Mediator.Pipeline.Rcv_Json/Snd_Json. Ce ne sont pas des composants BizTalk standard et nécessitent une planification de migration séparée.
STM.ICUTexto.EAI.EnvoiSMS — orchestrations, schémas, pipelines pour l'envoi SMSSTM.ICUTexto.EAI.Mediator — médiateur côté réception, pipelines JSON, schéma (ICUTextoSchema.xsd : { destinataires: token, contenu: string })STM.ICUTexto.EAI.ObtiensStatus — orchestrations de statut, schémas de rapport de livraisonSTM.ICUTexto.EAI.ReceptionSMS — gestion du webhook entrant Vudu, carte vuduInbound2MessageUsagerEntrantSTM.ICUTexto.EAI.Helper — façades (EnvoyerSMSHelper, EnvoyerSMSVuduHelper, DemanderStatusHelper, MettreAJourStatusHelper), Logger, AuthorizationManagerSTM.WCFHttpHeaderBehavior.EAI — comportement WCF personnalisé de point de terminaison pour l'injection de l'en-tête HTTP AuthorizationSTM.TLSEndpointBehavior.EAI — comportement WCF personnalisé de point de terminaison pour la gestion des certificats TLSSTM.JsonAssembler.EAI.PipelineComponents — composants de pipeline JSON personnalisésSTM.ICUSchema.EAI — schémas partagés : MessageUsager.Texto, ResultatExecutionSTM.ICUTextoExtraction.EAI — application d'extraction (application BizTalk distincte)ScheduledTaskAdapter.TaskComponents (tiers/personnalisé) — tâche planifiée basée sur SQL pour la purge quotidienne${uriFournisseur}. Points de terminaison : /send, /send_batch, /get_broadcast, /get_feed, /inbound (callback)${IcuDbAdress} (WCF-SQL), ${IcuDbAdoAdress} (ADO pour la tâche planifiée). Procédures stockées : SauvegarderTraitementSMS, CreerTraitementSMSBatch, UpdTraitementSMSBatch, updFeed, updBroadcast, PollTraitementSMSBroadcast, PollTraitementSMSFeed, CountTraitementSMSBroadcast, CountTraitementSMSFeed, PurgerTraitementTexto, MettreAJourTraitementTextoselExtractionTexto_SPPO dans le schéma icuextraction)${RepertoireArchive} pour les fichiers de résultats et les archives d'erreursLe diagramme ci-dessous montre la topologie d'intégration BizTalk complète pour STM.ICUTexto.EAI. Les emplacements de réception à gauche acceptent le trafic entrant ; les orchestrations exécutent la logique métier au centre ; les ports d'envoi à droite acheminent vers les systèmes externes.
graph LR
subgraph InternalCallers["Appelants internes"]
IC[Clients HTTP internes]
VW[Webhook Vudu]
end
subgraph ReceiveLocations["Emplacements de réception"]
RL1["EAI_EnvoiTexto\n/icutexto/api.svc POST /texto\nWCF-WebHttp · Rcv_Json"]
RL2["EAI_ReceptionVudu\n/icutexto/vudu/api.svc POST /inbound\nWCF-WebHttp · Rcv_JsonPromote"]
RL3["EAI_PollTraitementSmsBroadcast\nWCF-SQL TypedPolling\ndbo.PollTraitementSMSBroadcast"]
RL4["EAI_PollTraitementSmsFeed\nWCF-SQL TypedPolling\ndbo.PollTraitementSMSFeed\n[Désinscrit]"]
RL5["EAI_PurgerTraitementTexto\nAdaptateur Schedule · quotidien 03:00"]
end
subgraph MessageBox["BizTalk MessageBox (pub/sub)"]
MB[(MessageBox\nSQL Server)]
end
subgraph Orchestrations["Orchestrations"]
O1["EnvoyerSMS\nFiltre → Validation → Envoi"]
O2["EnvoyerSMSVudu\nEnvoi unitaire ou en lot vers Vudu"]
O3["SauvegarderDetailsEnvoi\nHelper de persistance SQL"]
O4["MettreAJourStatus\nInterrogation SQL → publication de requêtes de statut"]
O5["DemanderStatus\nRequête de rapport de livraison Vudu"]
O6["ExtraireSSPO\nExtraction SQL → publication en aval"]
end
subgraph SendPorts["Ports d'envoi"]
SP1["EAI_vuduSend\nPOST /send · HTTPS"]
SP2["EAI_vuduSendbatch\nPOST /send_batch · HTTPS"]
SP3["EAI_vuduGetBroadcast\nPOST /get_broadcast · HTTPS"]
SP4["EAI_vuduGetFeed\nPOST /get_feed · HTTPS"]
SP5["EAI_SQLTraitementSms\nWCF-SQL unidirectionnel\nSauvegarder / Creer / Upd"]
SP6["EAI_SQLTraitementSmsResponse\nWCF-SQL bidirectionnel\nupdFeed / updBroadcast"]
SP7["EAI_ResultatExecution\nFILE · ${RepertoireArchive}\\Out"]
SP8["EAI_Erreur\nFILE · archive d'erreurs"]
end
subgraph ExternalSystems["Systèmes externes"]
VUDU[Passerelle SMS Vudu\nhttps://uriFournisseur]
ICUDB[(Base de données SQL ICU\n${IcuDbAdress})]
SPPO[(Base de données icuextraction\n${IcuDbAdoAdress})]
FS[Système de fichiers d'archive\n${RepertoireArchive}]
end
IC -->|POST /texto| RL1
VW -->|POST /inbound| RL2
RL1 --> MB
RL2 --> MB
RL3 -->|TypedPolling broadcast| MB
RL4 -->|TypedPolling feed| MB
RL5 -->|Déclencheur planifié| MB
MB -->|MessageUsagerTexto| O1
MB -->|TypedPolling| O4
MB -->|declencheur| O6
O1 -->|appel| O2
O1 -->|appel| O3
O2 -->|appel| O3
O4 -->|publication DemanderStatusSchema| MB
MB -->|DemanderStatusSchema| O5
O2 --> SP1
O2 --> SP2
O5 --> SP3
O5 --> SP6
O4 --> SP5
O3 --> SP5
O1 --> SP7
O6 -->|publication extractionSPPO| MB
SP1 -->|HTTPS| VUDU
SP2 -->|HTTPS| VUDU
SP3 -->|HTTPS| VUDU
SP4 -->|HTTPS| VUDU
SP5 -->|WCF-SQL| ICUDB
SP6 -->|WCF-SQL| ICUDB
SP7 --> FS
SP8 --> FS
RL3 -->|interrogation| ICUDB
RL4 -->|interrogation| ICUDB
RL5 -->|purge ADO| ICUDB
O6 --> SPPO
Cette séquence couvre le flux principal d'envoi de SMS sortants — du POST HTTP entrant à la validation, l'envoi vers Vudu et la persistance SQL.
sequenceDiagram
autonumber
actor Caller as Appelant interne
participant APIM as Emplacement de réception BizTalk<br/>(EAI_EnvoiTexto)
participant MB as BizTalk MessageBox
participant EnvSMS as EnvoyerSMS<br/>orchestration
participant EnvVudu as EnvoyerSMSVudu<br/>sous-orchestration
participant SaveDB as SauvegarderDetailsEnvoi<br/>sous-orchestration
participant Vudu as Passerelle SMS Vudu
participant SQL as Base de données SQL ICU
Caller->>APIM: POST /icutexto/api.svc/texto (JSON, auth Basic)
APIM->>MB: Publication de MessageUsagerTexto (désérialisé)
MB->>EnvSMS: Activation (liaison directe sur MessageUsager.Texto)
alt Destinataire filtré
EnvSMS->>SaveDB: appel(msgId=-1, Statut=FILTRE)
SaveDB->>SQL: exec SauvegarderTraitementSMS
EnvSMS->>MB: Publication ResultatExecution (FILTRE)
else Message invalide
EnvSMS->>SaveDB: appel(msgId=-1, Statut=ERREUR)
SaveDB->>SQL: exec SauvegarderTraitementSMS
EnvSMS->>MB: Publication ResultatExecution (ERREUR)
else Destinataire unique
EnvSMS->>EnvVudu: appel(MessageUsagerTexto)
EnvVudu->>Vudu: POST /send {to, message} encodé formulaire<br/>Authorization: Bearer (du helper SSO)
Vudu-->>EnvVudu: {status, status_detail, msg_id}
EnvVudu->>SaveDB: appel(msgId, Statut=status_detail)
SaveDB->>SQL: exec SauvegarderTraitementSMS
EnvSMS->>MB: Publication ResultatExecution (SUCCES)
else Destinataires multiples (lot)
EnvSMS->>EnvVudu: appel(MessageUsagerTexto)
EnvVudu->>SQL: exec CreerTraitementSMSBatch(idMessage, nbEnvois)
SQL-->>EnvVudu: broadcastId
loop pour chaque segment de lot
EnvVudu->>Vudu: POST /send_batch {to, message}
Vudu-->>EnvVudu: {status, status_detail, msg_id}
EnvVudu->>SaveDB: appel(résultat par segment)
SaveDB->>SQL: exec SauvegarderTraitementSMS
end
EnvSMS->>MB: Publication ResultatExecution (SUCCES)
end
MB->>Caller: Réponse ResultatExecution (via port FILE vers archive)
Note over MB,SQL: L'interrogation de statut s'exécute séparément sur minuterie
MB->>MettreAJourStatus: Activation sur TypedPolling broadcast
activate MettreAJourStatus
MettreAJourStatus->>SQL: exec PollTraitementSMSBroadcast
SQL-->>MettreAJourStatus: List<BroadcastId>
loop pour chaque BroadcastId
MettreAJourStatus->>SQL: exec UpdTraitementSMSBatch
MettreAJourStatus->>MB: Publication DemanderStatusSchema
MB->>DemanderStatus: Activation
activate DemanderStatus
DemanderStatus->>Vudu: POST /get_broadcast {broadcast: batchId}
Vudu-->>DemanderStatus: ClxFullDeliveryReport
DemanderStatus->>SQL: exec updBroadcast
deactivate DemanderStatus
end
deactivate MettreAJourStatus
| Orchestration | Complexité | Effort (jours) | Bloquant | Équivalent Azure |
|---|---|---|---|---|
EnvoyerSMS |
Moyenne | 3 | Nécessite la décompilation de EnvoyerSMSHelper pour la logique de filtrage et de validation avant le codage |
Azure Function (isolated worker) déclenchée par Service Bus |
EnvoyerSMSVudu |
Haute | 5 | Le contrat de l'API Vudu (limites de débit, taille des lots, codes d'erreur) doit être confirmé ; décompilation du helper requise | Azure Durable Function (Orchestrator + Activity, fan-out pour lot) |
SauvegarderDetailsEnvoi |
Basse | 1 | Aucun — la signature de la procédure stockée est entièrement visible | Méthode en ligne SqlService.SaveSendDetail() dans les Functions appelantes |
MettreAJourStatus |
Moyenne | 3 | Confirmer que MettreAJourFeed est intentionnellement désinscrit avant de délimiter la migration |
Azure Function avec déclencheur minuterie + fan-out Service Bus |
DemanderStatus |
Moyenne | 2 | Nécessite une décision explicite sur la politique de gestion d'erreurs (dead-letter vs absorption) avec approbation des opérations STM | Azure Function déclenchée par Service Bus sms-status-request |
ExtraireSSPO |
Basse | 2 | La carte BizTalk selExtractionTexto_SPPO2extractionSPPO doit être récupérée depuis le fichier source .btm |
Azure Function avec déclencheur minuterie + transformation JSON en ligne |
Pipelines JSON personnalisés (Rcv_Json, Snd_wwwFormEncoded) |
Moyenne | 2 | Les assemblages des composants de pipeline personnalisés doivent être décompilés pour comprendre le comportement non standard | System.Text.Json + FormUrlEncodedContent en .NET |
STM.WCFHttpHeaderBehavior / STM.TLSEndpointBehavior |
Basse | 1 | Aucun — remplacés entièrement par HttpClient + récupération de secret Key Vault |
DefaultAzureCredential + HttpClient avec en-tête Authorization |
| Migration des identifiants SSO | Haute | 3 | Toutes les valeurs des applications affiliées SSO (${uriFournisseur}, jetons d'auth par Source) doivent être inventoriées et extraites avant tout déploiement Azure |
Secrets Azure Key Vault, accès par identité managée |
| Inventaire des variables de déploiement | Moyenne | 2 | Neuf variables paramétrées ne sont pas dans le code source — doivent être récupérées des scripts de déploiement BizTalk ou de la configuration d'environnement | Azure App Settings / références Key Vault dans local.settings.json et Bicep |
Effort total estimé : 24 jours-développeur (développeur unique ; des pistes parallèles sont possibles une fois les bloquants levés).
Compléter ces étapes avant d'écrire tout code Azure pour cette intégration.
STM.ICUTexto.EAI.Helper.dll avec ILSpy ou dnSpy. Exporter toutes les classes des espaces de noms EnvoiSMS, ObtiensStatus et Securite en fichiers source C#. Sauvegarder dans un dossier de dépôt partagé (ne pas jeter — ces fichiers contiennent toute la logique métier).STM.WCFHttpHeaderBehavior.EAI.dll et STM.JsonAssembler.EAI.PipelineComponents.dll depuis le GAC BizTalk (C:\Windows\assembly ou C:\Windows\Microsoft.NET\assembly). Décompiler les deux..btm pour selExtractionTexto_SPPO2extractionSPPO. Ouvrir dans Visual Studio / BizTalk Mapper pour visualiser le XSLT. Exporter le XSLT généré ({NomDeLaCarte}.xsl) pour réutilisation directe dans une Function.ssoclient.exe ou Console d'administration BizTalk → Applications affiliées). Lister toutes les applications affiliées pour STM.ICUTexto. Exporter les valeurs des champs (masquer les secrets, stocker de manière sécurisée).${uriFournisseur}, ${IcuDbAdress}, ${IcuDbAdoAdress}, ${IntervalPollingBroadcast}, ${MaxPollingBroadcast}, ${IntervalPollingFeed}, ${PoolingFeedNbrRow}, ${RepertoireArchive}, ${BtsProcessingHostInstance}. Les obtenir des scripts de déploiement XML BizTalk (.btdfproj ou fichiers de propriétés MSBuild) ou de l'équipe de déploiement./send_batch, et tous les codes d'erreur possibles dans status_detail.${IcuDbAdress} et scripter toutes les procédures stockées référencées dans cette spécification : SauvegarderTraitementSMS, CreerTraitementSMSBatch, UpdTraitementSMSBatch, updFeed, updBroadcast, PollTraitementSMSBroadcast, PollTraitementSMSFeed, PurgerTraitementTexto, MettreAJourTraitementTexto. Sauvegarder le DDL dans le contrôle de source.icuextraction et scripter selExtractionTexto_SPPO. Confirmer la sémantique des paramètres listeSource et oneShot avec l'équipe de données STM.dbo.TraitementSMS accepte le drapeau indBatch, et comprendre l'indexation sur IdMessage — cela détermine si les sessions Service Bus sont obligatoires pour les écritures ordonnées.STM.ICUTexto.EAI.ObtiensStatus.MettreAJourFeed (State=Unenlisted) et l'emplacement de réception STM.ICUTexto.EAI_PollTraitementSmsFeed sont intentionnellement désactivés. Obtenir une approbation écrite avant de les retirer du périmètre de migration.DemanderStatus : l'orchestration actuelle capture toutes les exceptions et se termine normalement. Décider avec les opérations STM si le remplacement Azure doit envoyer les requêtes de statut en échec en dead-letter ou continuer silencieusement. Documenter la décision.${RepertoireArchive}\Out et les fichiers d'erreur ${RepertoireArchive}\*.xml). Déterminer si un système en aval consomme ces fichiers. Si oui, planifier une transition vers un topic Service Bus ou Azure Blob avant de décommissionner les ports FILE.feat/fn-envoyer-sms).azurite --silent --location ./azurite --debug ./azurite/debug.log)..env.local (ignoré par git) avec les valeurs de remplacement pour toutes les variables extraites à l'étape 2. Ne jamais committer de vrais identifiants.