Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Utilice un functoid acumulativo a medida para realizar operaciones de acumulación para valores que ocurren varias veces dentro de un mensaje de instancia.
Debe implementar tres funciones al desarrollar un functoid acumulativo. Las tres funciones corresponden al inicializar, acumular y obtener acciones que el mapa necesita para realizar la acumulación. Antes de discutir estas funciones, es importante discutir la seguridad de los hilos de ejecución.
Escribir un functoid de Thread-Safe
El código functoid debe ser seguro para hilos porque, en condiciones de estrés, varias instancias de un mapa se pueden ejecutar simultáneamente. Algunos de los puntos que hay que recordar incluyen:
El estado estático debe ser seguro para hilos.
El estado de la instancia no siempre necesita ser seguro para subprocesos.
Diseñe teniendo en cuenta la ejecución en condiciones de alta tensión. Evite tomar bloqueos siempre que sea posible.
Evite la necesidad de sincronización si es posible.
BizTalk Server proporciona un mecanismo sencillo para reducir la complejidad de escribir un "functoid" acumulativo que sea seguro para subprocesos. Las tres funciones tienen el mismo primer parámetro, un valor de índice entero. BizTalk Server asigna un número único al valor de índice cuando llama a la función de inicialización. Puede usar este valor como índice en una matriz que contiene valores acumulados, como se muestra en el código siguiente:
private HashTable cumulativeArray = new HashTable();
…
// Initialization function
public string InitCumulativeMultiply(int index)
{
cumulativeArray[index] = 1.0;
return string.Empty;
}
En este ejemplo se usa un objeto HashTable en lugar de arrayList. Esto se debe a que la función de inicialización podría no ser llamada con valores de índice en el orden adecuado.
Implementación de las tres funciones acumulativas
Tendrá que implementar tres funciones para cada functoid acumulativo personalizado que desarrolle. Las funciones y los métodos que debe llamar en el constructor para establecerlos se resumen en la tabla siguiente. Todas las funciones devuelven valores de cadena.
Nota:
Puede determinar el mejor nombre para cada función, pero cada función debe tener el número y el tipo de argumentos especificados.
| Propósito de la función | Argumentos | Para establecer una referencia | Para establecer el script en línea |
|---|---|---|---|
| Inicialización | int index | SetExternalFunctionName |
SetScriptBuffer con functionNumber = 0 |
| Acumulación | int index, string val, string scope | SetExternalFunctionName2 |
SetScriptBuffer con functionNumber = 1 |
| Obtener | int index | SetExternalFunctionName3 |
SetScriptBuffer con functionNumber = 2 |
Inicialización
La inicialización le permite preparar los mecanismos que usará para realizar la acumulación. Puede inicializar una matriz, restablecer uno o varios valores o cargar otros recursos según sea necesario. El valor de cadena devuelto no se utiliza.
Acumulación
Aquí es donde se realiza la operación de acumulación adecuada para el functoid. BizTalk Server pasa los tres parámetros siguientes:
Index: Valor entero que representa una instancia de mapa. Puede haber varias instancias de mapa que se ejecuten simultáneamente.
Val. Cadena que contiene el valor que se debe acumular. A menos que esté escribiendo un functoid acumulativo para cadenas, se trata de un valor numérico.
Ámbito. Cadena que contiene un número que indica qué valor de elemento o atributo se debe acumular. Los valores reales se determinan mediante una implementación.
Decide qué valores se van a acumular y qué valores se van a omitir. Por ejemplo, puede omitir los valores que no son inferiores a 0, pero producir una excepción cuando un valor no es numérico. BaseFunctoid proporciona dos funciones (IsDate e IsNumeric) para ayudar con la validación.
Nota:
Si usa IsDate o IsNumeric en un script insertado, asegúrese de establecer RequiredGlobalHelperFunctions para que las funciones estén disponibles para el script.
El valor de cadena devuelto no se utiliza.
Obtener
Cuando BizTalk Server termina de recorrer en iteración todos los valores determinados por la configuración de functoid en el mapa, solicita el valor acumulado. La función get tiene un argumento, , Indexque es un valor entero que representa una instancia de mapa. La función debe usar el valor de índice para buscar y devolver el valor acumulado como una cadena.
Ejemplo
En el ejemplo siguiente se muestra cómo crear un functoid personalizado para realizar la multiplicación acumulativa. Se basa en un archivo de recursos que contiene tres recursos de cadena y un recurso de mapa de bits de 16 x 16 píxeles.
using System;
using Microsoft.BizTalk.BaseFunctoids;
using System.Reflection;
using System.Text;
using System.Collections;
using System.Globalization;
namespace Microsoft.Samples.BizTalk.CustomFunctoid
{
public class CumulativeMultiplyFunctoid : BaseFunctoid
{
private ArrayList myCumulativeArray = new ArrayList();
public CumulativeMultiplyFunctoid() : base()
{
//ID for this functoid
ID = 6001;
// Resource assembly must be ProjectName.ResourceName if building with VS.Net
SetupResourceAssembly("Microsoft.Samples.BizTalk.CustomFunctoid.CustomFunctoidResources", Assembly.GetExecutingAssembly());
// Pass the resource ID names for functoid name, tooltip
// description and the 16x16 bitmap for the Map palette
SetName("IDS_CUMULATIVEMULTIPLYFUNCTOID_NAME");
SetTooltip("IDS_CUMULATIVEMULTIPLYFUNCTOID_TOOLTIP");
SetDescription("IDS_CUMULATIVEMULTIPLYFUNCTOID_DESCRIPTION");
SetBitmap("IDB_CUMULATIVEMULTIPLYFUNCTOID_BITMAP");
// Put this string handling function under the Cumulative
// Functoid tab in the Visual Studio toolbox for functoids
Category = FunctoidCategory.Cumulative;
// 2 required parameters, no optional parameters
SetMinParams(1);
SetMaxParams(2);
// Functoid accepts three inputs
AddInputConnectionType(ConnectionType.AllExceptRecord);
AddInputConnectionType((~ConnectionType.FunctoidCount) & (~ConnectionType.FunctoidIndex) & (~ConnectionType.FunctoidIteration) & (~ConnectionType.FunctoidCumulative) & (~ConnectionType.FunctoidLooping) & (~ConnectionType.Record));
AddInputConnectionType(ConnectionType.AllExceptRecord);
// Set the output connection type
OutputConnectionType = ConnectionType.AllExceptRecord;
// Set the Initialize, Cumulative and Get functions
SetExternalFunctionName(GetType().Assembly.FullName, "Microsoft.Samples.BizTalk.CustomFunctoid.CumulativeMultiplyFunctoid", "InitCumulativeMultiply");
SetExternalFunctionName2("AddToCumulativeMultiply");
SetExternalFunctionName3("GetCumulativeMultiply");
}
// Initialization function
public string InitCumulativeMultiply(int index)
{
if (index >= 0)
{
if (index >= myCumulativeArray.Count)
{
myCumulativeArray.Add(1.0);
}
else
{
myCumulativeArray[index] = 1.0;
}
}
return "";
}
// Cumulative function
public string AddToCumulativeMultiply(int index, string val, string reserved)
{
if (index < 0 || index >= myCumulativeArray.Count)
{
return "";
}
if (IsNumeric(val))
{
double dval = Convert.ToDouble(val, CultureInfo.InvariantCulture);
myCumulativeArray[index] = (double)(myCumulativeArray[index]) * dval;
}
return myCumulativeArray[index].ToString();
}
// Get Function
public string GetCumulativeMultiply(int index)
{
if (index < 0 || index >= myCumulativeArray.Count)
{
return "";
}
return myCumulativeArray[index].ToString();
}
}
Véase también
Uso de BaseFunctoid
Desarrollo de un functoid en línea personalizado
Functoid personalizado (ejemplo de BizTalk Server)