사용자 지정 어댑터를 배포하는 방법
전체 어댑터 설치 프로세스는 다음 단계로 이루어집니다.
종속성을 확인합니다. 예를 들어 어댑터 런타임은 로컬 MSMQ 서비스에 의존하기 때문에 MSMQ 어댑터 설치 관리자는 이 로컬 MSMQ 서비스가 있는지 확인합니다.
로컬 파일 시스템을 설정합니다. 이 단계에서는 설치 폴더를 만들고 이진 및 지원 파일을 복사합니다. 폴더에 대한 액세스 권한과 파일 액세스 권한이 적절하게 구성되어 있는지 확인합니다.
관리되는 어셈블리를 시스템 전역 어셈블리 캐시에 설치합니다.
어댑터의 레지스트리 키를 만듭니다.
참고
32비트 어댑터의 경우 BizTalk Server 관리 콘솔은 레지스트리의 HKEY_CLASSES_ROOT 분기를 사용하여 사용자 지정 어댑터 구성을 가져옵니다. 32비트 어댑터가 64비트 서버에 설치된 경우 BizTalk Serve 관리 콘솔은 어댑터 구성 데이터에 대해 HKEY_CLASSES_ROOT\Wow6432Node\ 분기를 대신 사용합니다.
BizTalk Server에 어댑터를 추가합니다. 이는 어댑터에 대한 BizTalk 관리 데이터베이스의 새 항목을 의미할 뿐만 아니라 어댑터가 승격하는 속성을 반영하는 데 사용되는 속성 스키마에 대한 새 항목을 의미합니다. 이 단계가 BizTalk Server 관리 콘솔을 사용하여 수동으로 수행되는 경우가 있습니다.
예외
BizTalk Server 부분 설치 시에는 어댑터 설치 관리자가 종속성을 확인할 필요가 없을 수 있습니다. 예를 들어 관리 도구만 설치할 때는 어댑터 런타임이 사용되지 않으므로 어댑터 설치 관리자가 어댑터 런타임 종속성을 확인할 필요가 없습니다. BizTalk Server 런타임만 설치하는 경우에도 마찬가지입니다. 이 경우에도 어댑터 설치 관리자가 어댑터 디자인 타임 종속성을 확인할 필요가 없습니다.
다중 BizTalk Server 환경에서는 앞에 나와 있는 목록의 마지막 단계(BizTalk Server에 어댑터 추가)만 첫 번째 BizTalk Server에 어댑터를 설치할 때 수행됩니다. 이는 모든 BizTalk Server 서비스 인스턴스가 동일한 BizTalk 관리 데이터베이스(기본 이름인 BizTalkMgmtDB 사용)를 공유하기 때문입니다. 어댑터가 동일한 그룹의 다른 BizTalk Server에 추가되면 추가 단계는 실패합니다.
전역 어셈블리 캐시에 어댑터 어셈블리 설치
어댑터 설치 경로가 서로 다른 다중 BizTalk Server 호스트 환경을 지원하려면 어댑터 어셈블리를 시스템 전역 어셈블리 캐시에 설치해야 합니다.
어댑터 설치 및 구성 시 BizTalk 관리 데이터베이스(기본 이름인 BizTalkMgmtDB 사용)의 adm_adapter 테이블에서 새 어댑터 항목이 생성됩니다. 이 항목은 런타임 및 디자인 타임 모두에 대해 BizTalk Server에서 사용하는 참조 정보를 모두 포함합니다.
InBoundAssemblyPath 및 OutboundAssemblyPath 필드는 BizTalk Server 런타임에서 어댑터 이진 파일을 로드할 위치를 확인하는 데 사용됩니다. BizTalk Server 그룹에 대한 BizTalk 관리 데이터베이스가 하나만 있기 때문에 그룹의 모든 BizTalk Server는 이 동일한 정보 부분을 공유해야 합니다. 그룹 내 다른 BizTalk Server에 어댑터를 설치하려면 이러한 서버 각각에 동일한 설치 경로를 사용해야 합니다. 로컬 설치 경로가 BizTalk 관리 데이터베이스에 저장된 경로와 다르면 BizTalk Server는 어댑터 이진 파일을 로드할 수 없습니다.
항상 어댑터 설치 중 강력한 이름으로 어댑터의 어셈블리에 서명하고 Gacutil.exe를 사용하여 어댑터 어셈블리를 시스템 전역 어셈블리 캐시에 삽입합니다. InBoundAssemblyPath 및 OutboundAssemblyPath 필드가 null이거나 비어 있는지 확인합니다.
어댑터 구성을 위한 프레임워크 사용
BizTalk Server 어댑터 구성 UI(사용자 인터페이스)에 대한 속성 시트를 생성하는 메커니즘을 제공합니다. 이는 구성 속성의 XSD(XML 스키마 정의) 정의를 기반으로 합니다. 이 프레임워크를 사용하려는 어댑터 개발자는 몇 가지 어려운 문제에 직면하게 됩니다. 이 섹션에서는 이러한 몇 가지 문제에 대한 효과적인 해결책을 제시합니다.
모든 주요 속성에 대해 사용자 지정 속성 편집기 사용
속성 시트의 속성을 대상으로 중요한 속성 유효성 검사를 수행하도록 할 수는 없습니다. 프레임워크는 XSD(XML 스키마 정의) simpleType 제한을 사용하여 UI에 대한 유효성 검사 규칙을 정의하려고 합니다. 최대값 및 최소값에 대한 단순 규칙은 적용되지만 문자열 필드에 대한 정규식 제한은 지원되지 않습니다. 또한 제한이 적용되기 전에 데이터가 CLR(공용 언어 런타임) 유형으로 변환됩니다. 이는 UI 사용자에게 범위를 벗어남 오류가 아닌 복잡한 유형의 변환 오류가 발생하는 경우가 있음을 의미합니다. 무엇보다도 유효성 검사 논리가 매우 약합니다.
많은 어댑터 개발자가 채택한 해결책은 속성 시트에 주 속성에 대한 사용자 지정 속성 편집기를 작성하는 것입니다. 상호 종속 속성이 많은 경우에는 사용자 지정 속성 편집기가 결과를 단일 필드에 결합하고 나중에 런타임이 이들 결과를 분리할 수 있습니다. 이것이 일반적으로 아직은 간단하지만 반드시 필요한 사용자 지정 코드를 인터페이스에 가져오는 유일한 방법입니다.
사용자 지정 편집기는 비교적 바로 작성될 수 있으며 XSD의 속성에 주석을 달아 이를 사용할 수 있습니다. 주석은 속성 편집기 진입점을 표시하는 어셈블리를 참조합니다. 이를 코딩하여 CLR 폼을 표시합니다. 이제 일반 사용자 인터페이스를 작성하고 Visual Studio가 제공하는 일반 인터페이스 생성 도구를 사용할 수 있습니다.
다음 코드는 XSD를 사용하여 사용자 지정 속성 편집기를 추가하는 방법을 보여 줍니다.
<xs:element name="queueDetails" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:appinfo>
<baf:designer>
<baf:displayname _locID="queueName">Queue Definition</baf:displayname>
<baf:description _locID="receiveQueueDesc">Details of MQSeries Server, Queue Manager and Queue from where you want to receive messages.</baf:description>
<baf:category _locID="mqsCategory">MQSeries</baf:category>
<baf:editor assembly="Microsoft.BizTalk Server.Adapter.MQSAdmin.dll">Microsoft.BizTalk Server.Adapter.MQSAdmin.MQSUITypeEditor</baf:editor>
</baf:designer>
</xs:appinfo>
</xs:annotation>
</xs:element>
참조되는 코드는 다음과 같습니다.
public class MQSUITypeEditor : System.Drawing.Design.UITypeEditor
{
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle
(System.ComponentModel.ITypeDescriptorContext context)
{
return System.Drawing.Design.UITypeEditorEditStyle.Modal;
}
public override object EditValue (System.ComponentModel.ITypeDescriptorContext context,
System.IServiceProvider provider, object value)
{
Form qdForm = new QueueDefinitionForm(value);
IWindowsFormsEditorService service =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
DialogResult dialogResult = service.ShowDialog(qdForm);
//…
}
}
class QueueDefinitionForm : System.Windows.Forms.Form
{
// traditional UI code goes here!
}
관리 런타임은 XSD에서 참조되는 어셈블리를 찾을 수 있어야 하므로 이를 전역 어셈블리 캐시에 추가해야 합니다.