2010-03-29 9 views
6

Mi chiedevo se qualcuno sa dove posso vedere i dati di un messaggio sospeso nel database biztalk.Biztalk messaggi sospesi nella banca dati

Ho bisogno di questo perché circa 900 messaggi sono stati sospesi a causa di una convalida e ho bisogno di modificarli tutti, riprendere non è possibile.

So che le informazioni dei messaggi sospesi sono visualizzate in BizTalkMsgBoxDb nella tabella InstancesSuspended e che le diverse parti di ciascun messaggio sono mostrate nella tabella MessageParts. Tuttavia non riesco a trovare la tabella in cui sono memorizzati i dati effettivi.

Qualcuno ha idea di dove questo può essere fatto?

risposta

1

I Ho trovato un modo per farlo, non c'è niente che rovini il mio sistema quando voglio solo leggerli.

Come ho fatto utilizza il metodo "CompressionStreams" utilizzando Microsoft.Biztalk.Pipeline.dll.

Il metodo per fare questo:

public static Stream getMsgStrm(Stream stream) 
    { 
     Assembly pipelineAssembly = Assembly.LoadFrom(string.Concat(@"<path to dll>", @"\Microsoft.BizTalk.Pipeline.dll")); 
     Type compressionStreamsType = pipelineAssembly.GetType("Microsoft.BizTalk.Message.Interop.CompressionStreams", true); 
     return (Stream)compressionStreamsType.InvokeMember("Decompress", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, null, new object[] { (object)stream }); 
    } 

Poi ho connettersi con il mio database, compilare un set di dati e flusso fuori i dati a stringa, il codice:

 String SelectCmdString = "select * from dbo.Parts"; 
     SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(SelectCmdString, "<your connectionstring">); 
     DataSet myDataSet = new DataSet(); 
     mySqlDataAdapter.Fill(myDataSet, "BodyParts"); 

     foreach (DataRow row in myDataSet.Tables["BodyParts"].Rows) 
     { 
      if (row["imgPart"].GetType() != typeof(DBNull)) 
      { 
       SqlBinary binData = new SqlBinary((byte[])row["imgPart"]); 
       MemoryStream stm = new MemoryStream(binData.Value); 
       Stream aStream = getMsgStrm(stm); 
       StreamReader aReader = new StreamReader(aStream); 

       string aMessage = aReader.ReadToEnd(); 

       //filter msg 
       //write msg 
      } 
     } 

Ho poi scrivo ogni stringa a un appropriato "txt" o "xml" a seconda di ciò che vuoi, puoi anche filtrare determinati messaggi con espressioni regolari, ecc.

Spero che questo aiuti chiunque, sicuramente mi ha aiutato.

Saluti

0

Questo è più che probabile non supportato da Microsoft. Non rischiare di rovinare il tuo sistema. Se è necessario disporre di una modifica e inviare nuovamente, è necessario incorporare nell'orchestrazione. In caso contrario, la soluzione migliore è quella di utilizzare WMI per scrivere uno script per:

  1. tirare fuori tutti i messaggi sospesi
  2. terminare li
  3. modificarli
  4. inviare di nuovo i loro
+0

Allora, perché il punteggio negativo? Sarei curioso di sapere cosa stai pensando. –

+0

Penso che quando ha risposto alla sua prima riga era mirato a te "non c'è niente che rovini il mio sistema quando voglio solo leggerli" ... – Nix

+0

+1 per @ChrisLoris. Il consiglio di utilizzare WMI e di terminare i messaggi sospesi è corretto. L'altra parte del consiglio è forse formulata in modo più formale come "Microsoft non supporta l'accesso diretto al database BizTalk. Le versioni future di BizTalk possono cambiare lo schema, ecc.". Con questo in mente, considera che la soluzione proposta potrebbe dover essere modificata se è installata una nuova versione di produzione o anche una patch. –

0

si può trovare attraverso lo strumento HAT è sufficiente specificare lo schema, il porto e la data esatta con l'ora esatta e vi mostrerà i messaggi fare clic destro sul quello desiderato e salvare .

1

estrarre i messaggi da istanze sospese

Scenario:

BizTalk 2010 e SQL 2008 R2 è l'ambiente che abbiamo usato ribalta questo scenario.

Hai problemi con alcune integrazioni, 1500 istanze sospese all'interno di BizTalk e devi inviare i messaggi effettivi a un cliente, e quindi non vuoi salvarlo manualmente da BizTalk Administrator.

Ci sono molti blog e risorse Internet che indicano vbs, script di PowerShell come fare questo, ma ho usato BizTalk Terminator per risolvere questo tipo di scenari.

come ora BizTalk terminatore sta chiedendo 3 domande al momento dell'avviamento

database

I.1.All BizTalk viene eseguito il backup? II.2.Tutte le istanze dell'host sono interrotte? III.3.Tutti gli agenti BizTalk SQL vengono arrestati? Questo è ok quando cambierai qualcosa nei database BizTalk ma questo non è quello che stai per fare in questo scenario, stai solo usando lo strumento per leggere dai database BizTalk. Ma dovresti sempre avere dei backup dai database di BizTalk.

Sei sempre responsabile di ciò che stai facendo, ma quando abbiamo usato questi strumenti nel modo in cui descrivo non abbiamo alcun problema con questo scenario.

Quindi, dopo aver avviato lo strumento Terminator, fare clic su Sì per le 3 domande (non è necessario interrompere nulla in questo scenario) quindi connettersi all'ambiente corretto, eseguire prima questo nell'ambiente di test in modo da sentirsi a proprio agio con questo scenario , il passo successivo è scegliere un compito terminatore scegliere Count Instances (e salvare i messaggi) dopodiché devi compilare il parametro TAB con serviceClass e Hostname corretti e impostare SaveMessages su True e l'ultimo set FilesaveFullPath sulla cartella corretta che vuoi salvare i messaggi a.

Quindi è possibile scegliere di fare clic sul pulsante Esegui e in base alle dimensioni e al numero di volte necessario, dopo questo, disconnettere Terminator NON fare altro.

Si dovrebbe ora se si sono inseriti i valori corretti nel parametro TAB avere i messaggi salvati nella cartella FilesaveFullPath.

Scarica BizTalk terminatore da questo indirizzo:

http://www.microsoft.com/en-us/download/details.aspx?id=2846