Creare percorsi di ricezione MSMQ e porte di trasmissione a livello di codice
In questo argomento viene illustrato come utilizzare WMI per creare una porta o un indirizzo per l'adapter MSMQ.
Per altre informazioni, vedere Creating a Receive Location with a Datetime Schedule Configuration Using WMI (Creazione di un percorso di ricezione con una configurazione di pianificazione datetime tramite WMI ) nelle linee guida dell'interfaccia utente e nelle informazioni di riferimento sugli spazi dei nomi delle API per sviluppatori.
Impostazione dei valori delle proprietà
Il processo di creazione di una porta o di un indirizzo è sempre lo stesso:
Creare un oggetto del tipo corretto.
Impostare il valore delle proprietà dell'oggetto.
Eseguire il commit dei valori dell'oggetto nel database.
Tutte le schede hanno alcune proprietà, ad esempio HostName, in comune. È possibile impostare queste proprietà comuni assegnandole direttamente all'oggetto. Nel codice C# seguente viene illustrato un caso tipico:
objReceiveLocation["HostName"] = "BizTalkServerApplication";
È necessario assegnare i valori alle proprietà non condivise da tutti gli adapter. Creare un documento XML in una stringa e assegnare tale stringa alla proprietà CustomCfg. Nel codice C# seguente viene illustrato un caso tipico per un adapter FILE:
objReceiveLocation["CustomCfg"] =
@"<CustomProps>"
+ @"<BatchSize>20</BatchSize>"
+ @"<FileMask>*.xml</FileMask>"
+ @"<FileNetFailRetryCount>5</FileNetFailRetryCount>"
+ @"<FileNetFailRetryInt>5</FileNetFailRetryInt>"
+ @"</CustomProps>";
I nomi dei tag dell'elemento CustomProps sono i nomi interni utilizzati dall'adapter per le proprietà.
L'adapter MSMQ include un singolo tag, AdapterConfig, all'interno del tag CustomProps. Il tag AdapterConfig contiene una stringa di tag XML per i valori delle proprietà personalizzate racchiusi in un tag Config. Tuttavia, i tag sono codificati: "<" sostituisce "<" e ">" sostituisce ">". Ad esempio, l'XML per un sottoinsieme dell'adapter per le proprietà MSMQ è simile al seguente:
<Config>
<batchSize>40</batchSize>
</Config>
Si noti che l'attributo vt non viene usato. La stringa assegnata alla proprietà CustomCfg viene visualizzata come segue dopo la codifica:
<CustomProps><AdapterConfig vt="8"><Config><batchSize>40</batchSize></Config></AdapterConfig></CustomProps>
Nomi di proprietà personalizzate
Nella tabella seguente vengono descritti i nomi interni dell'adapter MSMQ Invia proprietà personalizzate.
Nome della proprietà personalizzata Send | Nome visualizzato |
---|---|
acknowledgeType | Tipo di riconoscimento |
administrationQueue | Coda di amministrazione |
certificato | Identificazione personale del certificato |
encryptionAlgorithm | Algoritmo di crittografia |
maximumMessageSize | Dimensione massima messaggio (in KB) |
password | Password |
priority | Priorità messaggio |
coda | Coda di destinazione |
ripristinabili | Recuperabile |
segmentationSupport | Supporto segmentazione |
sendBatchSize | Dimensioni batch |
sendQueueName | Coda di destinazione |
timeOut | Timeout |
timeOutUnits | Unità timeout |
transactional | Transazionale |
useAuthentication | Usa autenticazione |
useDeadLetterQueue | Usa coda di messaggi non recapitabili |
useJournalQueue | Usa coda diario |
userName | Nome utente |
Nella tabella seguente vengono descritti i nomi interni dell'adapter MSMQ Ricevere proprietà personalizzate.
Nome della proprietà personalizzata Receive | Nome visualizzato |
---|---|
batchSize | Dimensioni batch |
Password | Password |
Coda | Coda |
serialProcessing | Elaborazione sequenziale |
Transazionale | Transazionale |
userName | Nome utente |
Codice di esempio
Nel programma C# seguente viene creato un singolo indirizzo di ricezione per l'adapter MSMQ. Si presuppone che la porta di ricezione ReceivePort1 esista e utilizzi una funzione di supporto per codificare e formattare le proprietà personalizzate.
using System;
using System.Management;
using System.Text;
namespace CreateReceive
{
///
/// Program to create a receive location.
///
class CreateReceive
{
/// The main entry point for the application.
[STAThread]
static void Main()
{
// Custom properties & values
string cfg =
@"<queue>FORMATNAME:DIRECT=OS:MYMACHINE02\PRIVATE$\QUEUE2</queue>"
+ @"<batchSize>40</batchSize>"
+ @"<transactional>true</transactional>"
+ @"<serialProcessing>false</serialProcessing>";
CreateReceiveLocation (
"Code Created Location",
"ReceivePort1",
"MSMQ",
"BizTalkServerApplication",
EncodeCustomProps(cfg), // Encode the custom props
"Microsoft.BizTalk.DefaultPipelines.PassThruReceive,"
+ " Microsoft.BizTalk.DefaultPipelines,"
+ " Version=3.0.1.0, Culture=neutral,"
+ " PublicKeyToken=31bf3856ad364e35",
@"FORMATNAME:DIRECT=OS:MYMACHINE\PRIVATE$\QUEUE2"
);
}
static string EncodeCustomProps (string cp) {
// Enclose the properties and values in a Config> tag.
StringBuilder tmp = new StringBuilder( @"<Config>" + cp + @"</Config>");
// Encode the string
tmp = tmp.Replace("<","<");
tmp = tmp.Replace(">",">");
return (
// Enclose the encoded string with necessary tags
"<CustomProps><AdapterConfig vt=\"8\">"
+ tmp.ToString()
+ "</AdapterConfig></CustomProps>");
}
static void CreateReceiveLocation (
string name, // Location name
string port, // Receive port, already exists
string adapterName, // The transport type
string hostName, // BTS host
string customCfg, // Encoded custom properties
string pipeline, // Full specification of pipeline
string inboundTransport)// Inbound transport url
{
try
{
// Create options to store options in management object
PutOptions options = new PutOptions();
options.Type = PutType.CreateOnly;
// Create a management object
// Get the class
ManagementClass objReceiveLocationClass =
new ManagementClass(
"root\\MicrosoftBizTalkServer",
"MSBTS_ReceiveLocation",
null);
// Create an instance of the member of the class
ManagementObject objReceiveLocation =
objReceiveLocationClass.CreateInstance();
// Fill in the properties
objReceiveLocation["Name"] = name;
objReceiveLocation["ReceivePortName"] = port;
objReceiveLocation["AdapterName"] = adapterName;
objReceiveLocation["HostName"] = hostName;
objReceiveLocation["PipelineName"] = pipeline;
objReceiveLocation["CustomCfg"] = customCfg;
objReceiveLocation["IsDisabled"] = true;
objReceiveLocation["InBoundTransportURL"] = inboundTransport;
// Put the options -- creates the receive location
objReceiveLocation.Put(options);
}
catch (Exception excep)
{
System.Console.WriteLine("Create Receive Location ({0}) failed - {1}",
name, excep.Message);
}
}
}
}