Problemas de diseño del adaptador
La configuración del adaptador se almacena en la base de datos de inicio de sesión único (SSO) cuando el usuario realiza cambios de configuración durante el tiempo de diseño. En el tiempo de ejecución, el motor de mensajería recupera la configuración del adaptador y la entrega a éste. La información de configuración que se entrega a los adaptadores es de cuatro tipos:
Configuración del controlador de recepción
Configuración de la ubicación de recepción (extremo)
Configuración del controlador de envío
Configuración de la ubicación de envío (extremo)
Configuración del controlador de recepción y de envío
La configuración del controlador de un adaptador se entrega al adaptador en su implementación del IPersistPropertyBag opcional. Interfaz de carga . La configuración del controlador se entrega solo una vez, de modo que si la configuración del controlador del adaptador cambia una vez que el servicio de BizTalk ha comenzado, el adaptador no se actualiza. El modelo común consiste en que el adaptador trate la configuración del controlador como la configuración predeterminada; la configuración de extremo invalida la configuración del controlador según un esquema por extremos.
El fragmento de código que se muestra a continuación demuestra el análisis de la configuración. La configuración del adaptador se encuentra en la propiedad que se pasa a la llamada Load en la propiedad de cadena AdapterConfig. Este valor de propiedad contiene un documento XML que representa la configuración del adaptador. El adaptador necesita cargar su configuración en un modelo de objetos de documento (DOM) o en un lector XML y usa XPath para recuperar las propiedades individuales.
public class MyAdapter : IBTTransport,
IBTTransportConfig,
IBTTransportControl,
IPersistPropertyBag,
IBaseComponent
{
...
// Handler configuration properties...
private int defaultBatchSize = 0;
private string defaultHeader;
// IPersistPropertyBag.Load() implementation...
public void Load(IPropertyBag pb, int pErrorLog)
{
// The adapter configuration is in the property
// “AdapterConfig” in the form of an Xml blob...
object obj = null;
pb.Read("AdapterConfig", out obj, 0);
// Create a DOM and load the Xml blob...
XmlDocument dom = new XmlDocument();
string adapterConfig = (string)obj;
dom.LoadXml(adapterConfig);
// XPath the individual properties...
XmlNode node =
document.SelectSingleNode(“/Config/batchSize”);
defaultBatchSize = int.Parse(node.InnerText);
node = document.SelectSingleNode(“/Config/header”);
defaultHeader = node.InnerText;
}
}
Configuración de la ubicación de recepción
La información de configuración de ubicación de recepción se entrega a un adaptador en su implementación de IBTTransportConfig. Esta interfaz contiene los tres métodos AddReceiveEndpoint, UpdateEndpointConfig y RemoveReceiveEndpoint. El motor de mensajería notifica al adaptador sobre cuáles son los extremos que necesita escuchar para recibir mensajes. Cuando la configuración de un extremo individual cambia, se notifica ese cambio al adaptador. En cambio, cuando la configuración del controlador cambia, no se notifica este cambio al adaptador. Del mismo modo, el adaptador no tiene que controlar ventanas de servicio porque BizTalk Server agregue o quite extremos a medida que las ventanas de servicio se activan o inactivan.
AddReceiveEndpoint
Cuando un adaptador necesita empezar a escuchar en un punto de conexión, el motor llama a IBTTransportConfig.AddReceiveEndpoint pasando el URI de la ubicación de recepción, un contenedor de propiedades que contiene la configuración del adaptador para ese punto de conexión y un segundo contenedor de propiedades que contiene BizTalk Server configuración específica para ese punto de conexión. El adaptador debe escribir el URI en el contexto del mensaje como la propiedad del sistema BizTalk Server InboundTransportLocation.
La lectura de las propiedades de la ubicación de recepción desde la bolsa de propiedades del adaptador es lo mismo que la lectura de la configuración del controlador, tal y como se ha descrito anteriormente. La configuración de BizTalk Server pasada al adaptador contiene una sola propiedad, TwoWayReceivePort, que indica si el puerto es unidireccional o bidireccional. El fragmento de código siguiente ilustra cómo se evalúa si el puerto de recepción es unidireccional o bidireccional desde la bolsa de propiedades de BizTalk Server:
public void AddReceiveEndpoint(
string url,
IPropertyBag adapterConfig,
IPropertyBag bizTalkConfig )
{
...
// The property "TwoWayReceivePort" in the BizTalk Config
// property bag indicates whether the port is one or two
// way...
// Add receive location to config cache (not shown here)
object obj = null;
bizTalkConfig.Read("TwoWayReceivePort", out obj, 0);
if ( null != obj )
this.twoWay = (bool)obj;
}
UpdateEndpointConfig
Cuando se cambia la configuración de una ubicación de recepción activa, el motor usa la API UpdateEndpointConfig para notificar al adaptador que necesita usar una configuración diferente. Toda la configuración se entrega al adaptador, incluida la configuración específica de BizTalk Server.
RemoveReceiveEndpoint
Cuando una ubicación de recepción ya no está activa, se notifica al adaptador mediante RemoveReceiveEndpoint. Una vez que el adaptador vuelve de RemoveReceiveEndpoint , ya no se permite usar ese URI para enviar mensajes al motor.
Configuración del puerto de envío
El motor de mensajería escribe la configuración del puerto de envío en el contexto del mensaje en el espacio de nombres del adaptador antes de entregar el mensaje a éste. Ahora, es el adaptador el responsable de leer y validar la configuración que usa posteriormente para controlar la transmisión del mensaje. Para los adaptadores de envío compatibles con los envíos por lotes, los mensajes destinados a diferentes puertos de envío pueden encontrarse en el mismo lote, por lo que el adaptador necesita controlar estos lotes “mixtos”.
En el fragmento de código siguiente se muestra cómo leer outboundTransportLocation que es el URI del puerto de envío. También muestra cómo se lee el Blob de tipo XML que contiene la configuración del adaptador y, después, cómo se leen las propiedades individuales.
...
private static readonly PropertyBase UriProperty =
new BTS.OutboundTransportLocation();
private string propertyNamespace =
"http://schemas.mySchemas.com/MyAdapter/myadapter-properties";
private string uri;
private string headers;
private int timeOut = 1000;
private void ReadSendPortConfig(IBaseMessage msg)
{
// Read the OutboundTransportLocation,
// i.e. the send port uri....
uri = (string)msg.Context.Read(
UriProperty.Name.Name, UriProperty.Name.Namespace);
// Read the adapters configuration Xml blob from
// the message...
XmlDocument locationConfigDom = null;
object obj = msg.Context.Read(
"AdapterConfig", this.propertyNamespace);
// If this is a dynamic send there will not be
// any configuration...
if ( null != obj )
{
locationConfigDom = new XmlDocument();
locationConfigDom.LoadXml((string)obj);
this.headers = Extract(
locationConfigDom, "/Config/headers", true);
this.timeOut = ExtractInt32(
locationConfigDom, "/Config/timeOut", true);
}
}
// Helper method to XPath string properties...
private static string Extract(
XmlDocument document, string path, bool required)
{
XmlNode node = document.SelectSingleNode(path);
if (!required && null == node)
return String.Empty;
if (null == node)
throw new ApplicationException(string.Format(
"No property was found at {0}", path));
return node.InnerText;
}
// Helper method to XPath int32 properties...
private static int ExtractInt32(
XmlDocument document, string path, bool required)
{
string s = Extract(document, path, required);
return int.Parse(s);
}
Sugerencia de implementación: En general, los adaptadores deben usar la propiedad de contexto del mensaje OutboundTransportLocation para determinar la dirección a la que enviar el mensaje. De este modo, el adaptador puede controlar las transmisiones en los envíos estáticos y dinámicos de forma coherente. Además, simplifica la modificación de direcciones en los archivos de enlace de producción.
XSD
Cuatro archivos XSD incluidos en el ejemplo del adaptador de archivos del SDK controlan principalmente la configuración del adaptador: ReceiveHandler.xsd, ReceiveLocation.xsd, TransmitLocation.xsd y TransmitHandler.xsd.
En los temas siguientes se aborda cada uno de estos archivos y se describe cómo se pueden modificar.