C로 입력 노드 작성
메시지를 메시지 플로우로 수신하기 위해 C로 사용자 정의 입력 노드를 작성합니다.
시작하기 전에
태스크 정보
로드 가능 구현 라이브러리 또는 LIL은 C 노드의 구현 모듈입니다. LIL은 공유 또는 동적 링크 라이브러리(DLL)로 구현되지만 파일 확장자는 .dll이 아닌 .lil입니다.
노드에 대해 작성하는 구현 함수는 C 노드 구현 함수에 나열되어 있습니다. 런타임 통합 노드에서 구현된 유틸리티 함수를 호출하여 노드 조작을 지원할 수 있습니다. 이러한 함수는 C 노드 유틸리티 함수에 나열되어 있습니다.
IBM® App Connect Enterprise SwitchNode 와 TransformNode 라는 두 가지 사용자 정의 노드의 소스 코드를 제공합니다. 이 노드를 현재 상태로 사용하거나 수정할 수 있습니다.
노드 선언 및 정의
태스크 정보
통합 노드에 사용자 정의 노드를 선언하고 정의하려면 초기화 함수, bipGetMessageflowNodeFactory를 LIL에 포함시키십시오. 다음 단계는 통합 노드가 초기화 함수를 호출하는 방법과 초기화 함수가 사용자 정의 노드를 선언하고 정의하는 방법을 설명합니다.
프로시저
노드의 인스턴스 작성
태스크 정보
노드를 인스턴스화하려면 다음을 수행하십시오.
프로시저
속성 설정
태스크 정보
통합 노드를 시작할 때마다 또는 메시지 플로우를 새 값으로 재배치할 때마다 속성이 설정됩니다.
{
const CciChar* ucsAttr = CciString("nodeTraceSetting", BIP_DEF_COMP_CCSID) ;
insAttrTblEntry(p, (CciChar*)ucsAttr, CNI_TYPE_INTEGER);
_setAttribute(p, (CciChar*)ucsAttr, (CciChar*)constZero);
free((void *)ucsAttr) ;
}
{
const CciChar* ucsAttr = CciString("nodeTraceOutfile", BIP_DEF_COMP_CCSID) ;
insAttrTblEntry(p, (CciChar*)ucsAttr, CNI_TYPE_STRING);
_setAttribute(p, (CciChar*)ucsAttr, (CciChar*)constSwitchTraceLocation);
free((void *)ucsAttr) ;
}- 레이블
- userTraceLevel
- traceLevel
- userTraceFilter
- traceFilter
노드 기능 구현
태스크 정보
통합 노드는 입력 노드가 있다는 사실을 알게 되면 일정한 간격으로 이 노드의 cniRun 함수를 호출합니다. 그러면 cniRun 함수는 수행해야 할 조치를 결정해야 합니다. 데이터가 처리 가능한 경우 cniRun 함수는 메시지를 전파할 수 있습니다. 처리 가능한 데이터가 없으면 통합 노드가 구성 변경을 계속할 수 있도록 cniRun 함수가 CCI_TIMEOUT을 리턴해야 합니다.
If ( anything to do )
CniDispatchThread;
/* do the work */
If ( work done O.K.)
Return CCI_SUCCESS_CONTINUE;
Else
Return CCI_FAILURE_CONTINUE;
Else
Return CCI_TIMEOUT;기본 메시지 구문 분석기 속성 대체(선택사항)
태스크 정보
입력 노드 구현은 일반적으로 초기에 입력 메시지를 구문 분석하는 메시지 구문 분석기를 판별합니다. 예를 들어, MQInput 노드는 MQMD 구문 분석기가 MQMD 헤더를 구문 분석해야 함을 나타냅니다. 사용자 정의 입력 노드는 포함된 다음 속성을 사용하거나 기본값으로 대체해서, 적절한 헤더 또는 메시지 구문 분석기 및 구문 분석을 제어하는 모드를 선택할 수 있습니다.
- 구현 함수를 선언하십시오.
CciFactory LilFactoryExportPrefix * LilFactoryExportSuffix bipGetMessageflowNodeFactory() { .... CciFactory* factoryObject; .... factoryObject = cniCreateNodeFactory(0, (unsigned short *)constPluginNodeFactory); ... vftable.iFpCreateNodeContext = _createNodeContext; vftable.iFpSetAttribute = _setAttribute; vftable.iFpGetAttribute = _getAttribute; ... cniDefineNodeClass(&rc, factoryObject, (CciChar*)constSwitchNode, &vftable); ... return(factoryObject); } - cniCreateNodeContext 구현 함수에 속성을
설정하십시오.
위의 코드 예에서는 insAttrTblEntry 메소드가 호출됩니다. 이 메소드는 SwitchNode 및 TransformNode 샘플 사용자 정의 노드에 선언됩니다.CciContext* _createNodeContext( CciFactory* factoryObject, CciChar* nodeName, CciNode* nodeObject ){ NODE_CONTEXT_ST* p; ... /* Allocate a pointer to the local context */ p = (NODE_CONTEXT_ST *)malloc(sizeof(NODE_CONTEXT_ST)); /* Create attributes and set default values */ { const CciChar* ucsAttrName = CciString("firstParserClassName", BIP_DEF_COMP_CCSID); const CciChar* ucsAttrValue = CciString("MYPARSER", BIP_DEF_COMP_CCSID) ; insAttrTblEntry(p, (CciChar*)ucsAttrName, CNI_TYPE_INTEGER); /*see sample BipSampPluginNode.c for implementation of insAttrTblEntry*/ _setAttribute(p, (CciChar*)ucsAttrName, (CciChar*)ucsAttrValue); free((void *)ucsAttrName) ; free((void *)ucsAttrValue) ; }
노드의 인스턴스 삭제
태스크 정보
노드는 메시지 플로우가 재배치될 때 또는 통합 서버 프로세스가 중지될 때 ( mqsistop 명령 사용) 영구 삭제됩니다. 노드가 영구 삭제되면 cniDeleteNodeContext 함수를 호출하여 사용된 모든 메모리를 비우고 보유한 모든 자원을 해제해야 합니다. 예를 들어,
void _deleteNodeContext(
CciContext* context
){
static char* functionName = (char *)"_deleteNodeContext()";
return;
}