다음을 통해 공유


사용자 지정 누적 펑토이드 개발

사용자 지정 누적 펑토이드를 사용하여 인스턴스 메시지 내에서 여러 번 발생하는 값에 대한 누적 연산을 수행할 수 있습니다.

누적 펑토이드를 개발할 때는 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 는 유효성 검사를 지원하기 위해 IsDateIsNumeric이라는 두 가지 함수를 제공합니다.

참고

인라인 스크립트에서 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 샘플)