Aspect Technique

Tables et champs des interfaces

Chaque fois qu'une nouvelle interface est créée, une table des interfaces (INTERFACE_[ID]) est créée dans la base de données. Elle contient un certain nombre de champs standard et, le cas échéant, des champs supplémentaires qui sont définis de deux façons :

  • Interface Fichier : des champs personnalisés peuvent être définis lors de la création de l'interface
  • Interface Plugin : les champs sont fixés dans le plugin lui-même. Mais exceptionnellement le plugin permet de créer des champs supplémentaires.

Remarque : dans la base de données, une interface est définie sous la forme d'une fiche dans la table des INTERFACES. La configuration des champs personnalisés est stockée dans le fichier XML de cette interface.

 

 

Interface execution

Les modes d’exécution des Interfaces Plugin peuvent être ‘instantanés’ ou ‘programmés’. Ces deux modes insèrent toujours des fiches dans le tableau d’interface. Le Plugin n’est jamais exécuté directement.

Trois fonctionnements standard caractérisent une interface Plugin :

  • Écrire : Les nouvelles fiches sont extraites du tableau d’Interface et envoyées au Plugin. La périodicité et le nombre de fiches peuvent être configurés. Pour chaque élément traité, le Plugin renvoie un résultat.
  • Lire (polling) : Les opérations de lecture sont effectuées dans deux situations et le résultat se traduit toujours par une mise à jour du tableau d’Interface..

Première situation – Plugin sortant : La routine de lecture est appelée et interroge le Plugin à propos des mises à jour sur les éléments déjà envoyés. Pour chaque élément actualisé, le Plugin renvoie un CQID et, avec ce CQID, l’interface sollicite des données et les sauvegarde dans le tableau d’interface.

Deuxième situation – Plugin entrant : La routine de lecture est appelée et interroge le Plugin à propos de nouveaux éléments entrants. Dans ce cas, les données sont automatiquement renvoyées à l’Interface, car aucun CQID n’est disponible.

  • Traitement : Contrairement aux interfaces fichier, les interfaces Plugin supportent le traitement direct des flux. Cela signifie que tout changement apporté au niveau du tableau d’interface (drapeau ‘Modifié’ placé sur 1) est automatiquement traité par le CampaignAgent.

Pour automatiser cette mise à jour, certaines conditions préalables sont obligatoires :

  • L’interface doit être utilisée dans un Journey.
  • L’un des événements définis dans l’onglet ‘Événements’ des propriétés de l’Interface doit être utilisé dans le Journey.

 

 

Exemple plugin code

Le code ci-dessous reprend toutes les étapes nécessaires à la création d’une interface transcrivant les données dans un fichier journal.

Pour faciliter la compréhension, des explications sont données avant chaque partie de code:

publicclassSelligentLOG: IChannelModule, IChannelOutput
{

IChannelModuledoit être mis en oeuvre dans chaque Plugin, car il prend en charge l’enregistrement et la configuration du Plugin dans le CampaignAgent.

Quatre méthodes doivent y être définies:

 

 

  • Create: Cette méthode est appelée par le processus d’hébergement pour créer le plugin.

#regionIChannelModule
    IChannelHost m_Host;
    publicboolCreate(IChannelHost Host,outString ErrorStr)
    {
        ErrorStr ="";
        m_Host = Host;
        Host.WriteLog("SelligentLOG plugin v1.0 created",false);
        returntrue;
    }

 

 

  • GetConfigInterface: Fournit la configuration du plugin au processus d’hébergement.

    // Get Interface Info XML
    publicboolGetConfigInterface(outString Xml,outString ErrorStr)
    {
        ErrorStr ="";
        Xml ="";
        Xml +="<XML GUID='32DD0A34-28B9-4DD2-81F2-3AF765A2F713' NAME='Selligent LOG Module' VERSION='1.0' DIRECTION='OUT' TYPE='LOG' CAPABILITIES='WRITE'>";
        Xml +="<DESCRIPTION>Selligent Log module</DESCRIPTION>";
        Xml +="<PARAMETERS>";
        Xml +="</PARAMETERS>";
        Xml +="<INTERFACE CONFIGURABLE='TRUE' DYNAMIC='FALSE'>";
        Xml +="<FIELDS>";
        Xml +="</FIELDS>";
        Xml +="</INTERFACE>";
        Xml +="</XML>";
        Xml = Xml.Replace("'","\"");
        returntrue;
    }

  • GetDataInterface: Permet de retrouver la définition du plugin (champs et types) en fonction d’un ensemble défini de variables de configuration

    // Get Data Interface based on a certain configuration
    publicboolGetDataInterface(String Config,outString Xml,outString ErrorStr)
    {
        ErrorStr ="Not implemented";
        Xml ="";
        returnfalse;
    }

  • ValidateConfig: Méthode utilisée pour valider l’ensemble actuel de variables de configuration

//validate the config.
    publicboolValidateConfig(refString Config,outstringErrorStr)
    {
        ErrorStr ="Not ed";
        returntrue;
    }
    #endregion

IChanneltOutput.précise l’unité de sortie

Deux méthodes y sont définies

WriteData: Envoi des données au plugin, sous la forme d’un document XML pouvant contenir plusieurs fiches.

    #regionIChannelOutput
    // Write data towards the interface
    publicboolWriteData(String Config,refString Xml,outString ErrorStr)
    {
        ErrorStr ="";
        NetXmlDoc iConfigDoc =newNetXmlDoc();
        NetXmlDoc iDataDoc =newNetXmlDoc();
        if(iConfigDoc.LoadXml(Config) ==false)
        {
            ErrorStr ="Unable to parse Config XML";
            returnfalse;
        }
        if(iDataDoc.LoadXml(Xml) ==false)
        {
            ErrorStr ="Unable to parse Data XML";
            returnfalse;
        }
        Stream iStream = File.Open("c:\\temp\\myfile.txt", FileMode.Append);
        StreamWriter iWriter =newStreamWriter(iStream);
        if(iStream ==null)
        {
            ErrorStr ="Unable to open file";
            returnfalse;
        }

        for(inti = 0; i < iDataDoc.GetRootNode().GetChildCount(); i++)
        {
            iWriter.WriteLine("RECORD");
            NetXmlNode iNode = iDataDoc.GetRootNode().GetChild(i);
            for(intc = 0; c < iNode.GetChildCount(); c++)
            {
                NetXmlNode Field = iNode.GetChild(c);
                String Name = Field.GetAttribute("NAME");
                String Content = Field.GetContent();
                Content = Content.Replace("\n"," ");
                iWriter.WriteLine(Name +":"+ Content);
                iNode.SetAttribute("EXTID","P_"+ DateTime.Now.ToString("yyyyMMdd_HHmmss"));
            }
        }
        iWriter.Flush();
        iStream.Close();
        Xml = iDataDoc.GetXml();
        returntrue;
    }

 

  • ReadData: Interroge le plugin afin de s’assurer de la disponibilité de nouvelles données. Ces données sont envoyées sous la forme d’un document XML pouvant contenir plusieurs fiches

   // Read data from the interface
    publicboolReadData(String Config,refString Xml,outString ErrorStr)
    {
        ErrorStr ="Not ed";
        returnfalse;
    }
    #endregion
}

 

Etats des fiches des interfaces

1= collecte

2= in cours

10= erreur

20= lot : le fichier a été créé mais n'a pas encore été envoyé

25= en attente de retour d'information

30= succès (exécuté)

35= erreur de retour d'information : traitement réussi, mais une erreur s'est produite lors du retour d'information

40= retour d'information

50= annulé

60= pas de gestionnaire : aucun gestionnaire n'a été trouvé (logique d'envoi incomplète)

61= bloqué par une règle

 

Retour à la rubrique Interfaces