Kader Yildirim
Notions avancées avec Biztalk Server 2006 R2
Utilisation des notions d'interchange, corrélation et convoi avec BizTalk Server 2006 R2
Par Kader Yildirim publié le 09/06/2008 à 08:04, lu 1134 fois, 6 pages
 3 | Développement du désassembleur
Le désassembleur développé lors du premier article est mis à jour afin de générer plusieurs messages au lieu d'un message multi-part :

public void Disassemble(Microsoft.BizTalk.Component.Interop.IPipelineContext pc,

                                Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)

        {

            // not supported

            if (inmsg.PartCount != 1)

                return;

 

            Dictionary<Guid, Pair<Schema, Stream>> dvn = XmlValidableNodesFinder.Instance.Find(

                inmsg.BodyPart.GetOriginalDataStream(), this.Schemas);

 

            IBaseMessageFactory bmf = pc.GetMessageFactory();

            Guid msgSetID = Guid.NewGuid();

            foreach (KeyValuePair<Guid, Pair<Schema, Stream>> kvp in dvn)

            {

                string SchemaName = null == kvp.Value.Left ? string.Empty : kvp.Value.Left.DocSpecName;

                IBaseMessage bm = BuildMessage(bmf, inmsg, msgSetID, dvn.Count, kvp.Key, SchemaName);

                bm.AddPart(kvp.Key.ToString(), BuildMessagePart(bmf, kvp.Value, pc), true);

            }

 

        }

De plus la fonction BuildMessage devient :

private IBaseMessage BuildMessage(IBaseMessageFactory bmf, IBaseMessage inputMsg,

            Guid msgSetID, int msgCount, Guid partID, string schemaName)

        {

            IBaseMessage bm = bmf.CreateMessage();

            bm.Context = PipelineUtil.CloneMessageContext(inputMsg.Context);

            bm.Context.Promote(this.MsgSetID, this.PropertiesNamespace, msgSetID.ToString("B"));

            bm.Context.Write(this.MsgCount, this.PropertiesNamespace, msgCount);

            bm.Context.Write(this.PartID, this.PropertiesNamespace, partID.ToString("B"));

            bm.Context.Promote(this.PartSchemaName, this.PropertiesNamespace, schemaName);

 

            _msgs.Enqueue(bm);

            return bm;

        }

Dans cette fonction les propriétés de contexte sont simples ou promues quand elles sont utilisées pour, par exemple, router les messages dans une orchestration :
  1. MsgSetID affecte un numéro unique par message d'entrée et permet ainsi de savoir que tous les fragments proviennent d'une même source.
  2. MsgCount est utile pour connaître le nombre de fragments qui ont été extraits de la source. Cette information est utilisée pour la reconstruction du message de sortie.
  3. PartSchemaName permet de savoir quel schéma a validé ce fragment. Ceci est utile pour router le document vers l'orchestration capable de la consommer.
  4. Enfin PartID est utile pour connaître à quel endroit du document source le fragment a été extrait. Cette information est utilisée lors de la reconstruction du message de sortie.
 
» Démarrer une discussion