시작하기 전에
LIL(Loadable Implementation Library)는 C 노드(또는 구문 분석기)용 구현 모듈입니다. LIL은 DLL(Dynamic Link Library)로 구현되며 파일 확장자 .dll이 아닌 .lil을 가집니다.
개발자가 작성해야 하는 구현 함수는 C 노드 구현 함수에 나열되어 있습니다. 이 프로세스를 돕기 위해 WebSphere Message Broker가 제공하는 유틸리티 함수는 C 노드 유틸리티 함수에 나열되어 있습니다.
WebSphere Message Broker에서는 두 개의 샘플 사용자 정의 노드, 즉 SwitchNode 및 TransformNode의 소스를 제공합니다. 현재 상태에서 이 노드를 사용하거나 수정할 수 있습니다. 사용할 User-defined Extension 샘플도 있습니다.
개념적으로, 메시지 처리 노드는 메시지를 일정 방식으로 처리하는 데 사용되고, 출력 노드는 메시지를 비트스트림으로 출력하는 데 사용됩니다. 그러나, 메시지 처리 노드와 출력 노드는 코딩할 때 근본적인 공통점이 있습니다. 출력 노드 내에서도 메시지 처리를 수행할 수 있으며, 마찬가지로 메시지 처리 노드를 사용하여 메시지를 비트스트림으로 출력할 수도 있습니다. 간단히 말해, 이 주제에서는 주로 메시지 처리 노드로서의 노드에 관해 언급하지만, 두 가지 유형의 노드의 기능성을 설명합니다.
void defineSwitchNode(void* factoryObject){ static CNI_VFT vftable = {CNI_VFT_DEFAULT}; /* Setup function table with pointers to node implementation functions */ vftable.iFpCreateNodeContext = _createNodeContext; vftable.iFpDeleteNodeContext = _deleteNodeContext; vftable.iFpGetAttributeName2 = _getAttributeName2; vftable.iFpSetAttribute = _setAttribute; vftable.iFpGetAttribute2 = _getAttribute2; vftable.iFpEvaluate = _evaluate; cniDefineNodeClass(0, factoryObject, L"SwitchNode", &vftable); return; }이는 구성 스레드에서 호출됩니다.
사용자 정의 노드는 cniEvaluate 함수를 구현하여 메시지 처리 또는 출력 노드의 성능을 제공할 때 자체적으로 식별을 확인합니다. 사용자 정의 노드는 cniEvaluate 또는 cniRun 구현 함수 중 하나 또는 두 가지 모두를 구현해야 합니다. 아니면, 브로커는 사용자 정의 노드를 로드하지 못하고 cniDefineNodeClass 유틸리티 함수가 실패하면서 CCI_MISSING_IMPL_FUNCTION이 리턴됩니다.
사용자 정의 메시지 처리 노드가 포함된 메시지 플로우가 정상적으로 전개될 때, 메시지 플로우를 통해 전달된 각 메시지마다 노드의 cniEvaluate 함수가 호출됩니다.
메시지 플로우 데이터, 즉, 메시지, 전역 환경, 로컬 환경, 예외 목록은 노드의 입력 터미널에서 수신됩니다.
void cniEvaluate( CciContext* context, CciMessage* destinationList, CciMessage* exceptionList, CciMessage* message ){ ... }
브로커를 시작할 때마다 또는 메시지 플로우를 새 값으로 재전개할 때 속성이 설정됩니다. 구성 스레드에서 사용자 코드를 호출하여 브로커가 속성을 설정합니다. 사용자 코드는 향후 메시지 처리 시 사용하기 위해 이 속성을 노드 컨텍스트 영역에 저장해야 합니다.
{ 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) ; }
브로커가 큐에서 메시지를 검색하고 해당 메시지가 사용자 정의 메시지 처리 또는 출력 노드의 입력 터미널에 도착할 때, 브로커는 구현 함수 cniEvaluate를 호출합니다. 이 함수는 메시지 처리 스레드에서 호출되고 메시지로 수행할 사항을 결정해야 합니다. 특히 추가 인스턴스가 사용될 경우 이 함수는 다중 스레드에서 호출될 수 있습니다.