사용자 지정 누적 펑토이드 개발
사용자 지정 누적 펑토이드를 사용하여 인스턴스 메시지 내에서 여러 번 발생하는 값에 대한 누적 연산을 수행할 수 있습니다.
누적 펑토이드를 개발할 때는 3가지 함수를 구현해야 합니다. 3가지 함수는 맵이 누적을 수행하는 데 필요한 초기화, 누적 및 가져오기 작업입니다. 이러한 함수에 대한 설명을 보기 전에 먼저 스레드로부터의 안전성에 대해 이해하는 것이 좋습니다.
스레드로부터 안전한 펑토이드 작성
스트레스 상태에서는 맵의 여러 인스턴스가 동시에 실행될 수 있으므로 펑토이드 코드는 스레드로부터 안전해야 합니다. 다음 사항에 유의하십시오.
정적 상태는 스레드로부터 안전해야 합니다.
인스턴스 상태는 항상 스레드로부터 안전해야 할 필요는 없습니다.
스트레스가 심한 상태에서의 실행을 고려하여 오케스트레이션을 디자인하고 가능하면 잠금이 발생하지 않도록 하십시오.
가능하면 동기화가 필요하지 않도록 하십시오.
BizTalk Server는 스레드로부터 안전한 누적 펑토이드를 간단하게 작성할 수 있는 간단한 메커니즘을 제공합니다. 3가지 함수 모두 첫 번째 매개 변수가 정수 인덱스 값으로 동일합니다. BizTalk Server는 초기화 함수를 호출할 때 이 인덱스 값에 고유 번호를 할당합니다. 다음 코드에서와 같이 누적 값을 저장하는 배열에 대한 인덱스로 이 값을 사용할 수 있습니다.
private HashTable cumulativeArray = new HashTable();
…
// Initialization function
public string InitCumulativeMultiply(int index)
{
cumulativeArray[index] = 1.0;
return string.Empty;
}
이 예에서는 ArrayList 대신 HashTable을 사용합니다. 그 이유는 순차적 인덱스 값으로 초기화 함수를 호출할 수 없기 때문입니다.
3가지 누적 함수 구현
개발 중인 각 사용자 지정 누적 펑토이드에 대해 3가지 함수를 구현해야 합니다. 다음 표에서는 펑토이드를 설정하기 위해 생성자에서 호출해야 하는 함수 및 메서드를 요약해서 보여 줍니다. 모든 함수는 문자열 값을 반환합니다.
참고
각 함수에 대해 가장 적합한 이름을 지정하고 각 함수에 지정된 인수의 번호 유형을 설정합니다.
함수 용도 | 인수 | 참조 설정 | 인라인 스크립트 설정 |
---|---|---|---|
초기화 | int index | SetExternalFunctionName | SetScriptBuffer with functionNumber = 0 |
누적 | int index, string val, string scope | SetExternalFunctionName2 | SetScriptBuffer with functionNumber = 1 |
가져오기 | int index | SetExternalFunctionName3 | SetScriptBuffer with functionNumber = 2 |
초기화
초기화는 누적을 수행하는 데 사용할 메커니즘을 준비합니다. 필요에 따라 배열을 초기화하거나, 하나 이상의 값을 재설정하거나, 다른 리소스를 로드할 수 있습니다. 문자열 반환 값은 사용되지 않습니다.
누적
펑토이드에 적합한 누적 연산을 수행합니다. BizTalk Server는 다음 3가지 매개 변수로 값을 전달합니다.
Index. 맵 인스턴스를 나타내는 정수 값입니다. 여러 맵 인스턴스가 동시에 실행될 수도 있습니다.
Val. 누적되어야 하는 값을 포함하는 문자열입니다. 문자열 누적 펑토이드를 작성하는 경우가 아니면 숫자 값입니다.
범위 누적되어야 하는 요소 또는 특성 값을 나타내는 번호를 포함하는 문자열입니다. 실제 값은 구현에 따라 결정됩니다.
누적할 값과 무시할 값을 판단합니다. 예를 들어 값이 0 미만이면 무시하고 값이 숫자가 아니면 예외를 throw할 수 있습니다. BaseFunctoid 는 유효성 검사를 지원하기 위해 IsDate 및 IsNumeric이라는 두 가지 함수를 제공합니다.
참고
인라인 스크립트에서 IsDate 또는 IsNumeric 을 사용하는 경우 스크립트에서 함수를 사용할 수 있도록 RequiredGlobalHelperFunctions 를 설정해야 합니다.
문자열 반환 값은 사용되지 않습니다.
가져오기
BizTalk Server는 맵의 펑토이드 설정에 따라 결정된 모든 값을 처리한 다음 누적된 값을 요청합니다. get 함수에는 맵 instance 나타내는 정수 값인 인수가 하나 Index
있습니다. 사용자의 함수에서는 이 인덱스 값을 사용하여 누적된 값을 찾고 문자열로 반환합니다.
예제
다음 예에서는 누적 곱하기 연산을 수행하기 위한 사용자 지정 펑토이드를 만드는 방법을 보여 줍니다. 이 예제에서는 세 개의 문자열 리소스와 16x16 픽셀 비트맵 리소스를 포함하는 리소스 파일이 사용됩니다.
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();
}
}
참고 항목
BaseFunctoid 사용
사용자 지정 인라인 펑토이드 개발
사용자 지정 펑토이드(BizTalk Server 샘플)