1

다음 xml 메시지 (입력 대기열에 도착)를 BLOB 객체로 감사 데이터베이스 (Oracle 10g)에 넣으려면 다음 ESQL 코드를 사용하고 있습니다. 코드는 IBM WebSphere Message Broker 6.0에서 사용할 때 작동합니다. 그러나 최근에는 IBM WebSphere Message Broker 7.0으로 이주했으며 이제 XML이 아닌 메시지는 데이터베이스로 감사하는 대신 백 아웃 대기열로 이동합니다. 내가 사용 (dB로 비 XML 메시지를 기록) 서브 플로우에 대한 ESQL 코드는 다음과 같습니다MQ 대기열에 도착하는 Non-XML 메시지를 데이터베이스에 쓸 수 없습니다.

CREATE COMPUTE MODULE "ACIF_AUDIT_1_5_Insert exception into msg" 
CREATE FUNCTION main() RETURNS BOOLEAN BEGIN 
SET OutputRoot = InputRoot; 


CREATE FIRSTCHILD OF OutputRoot.XML.MSG.APP_DATA Name 'APP_ERROR'; 
CREATE LASTCHILD OF OutputRoot.XML.MSG.APP_DATA.APP_ERROR Name 'ERROR_SOURCE' VALUE 

'ACIFBROKER'; 
CREATE LASTCHILD OF OutputRoot.XML.MSG.APP_DATA.APP_ERROR Name 'ERROR_OPERATION' VALUE 'ACIF_AUDIT_Exception'; 
CREATE LASTCHILD OF OutputRoot.XML.MSG.APP_DATA.APP_ERROR Name 'ERROR_CODE' VALUE ''; 
CREATE LASTCHILD OF OutputRoot.XML.MSG.APP_DATA.APP_ERROR Name 'ERROR_STRING'; 
Set OutputRoot.XML.MSG.APP_DATA.APP_ERROR.ERROR_STRING = InputExceptionList; 
CREATE LASTCHILD OF OutputRoot.XML.MSG.APP_DATA.APP_ERROR Name 'ERROR_DETAIL' VALUE 'Exception List'; 

SET OutputRoot."MQRFH2" = NULL; 
SET OutputRoot.MQMD.CodedCharSetId = MQCCSI_INHERIT; /*819*/ 
SET OutputRoot.MQMD.Encoding = MQENC_NATIVE;   /*273*/ 
Set OutputRoot.MQMD.Format = 'MQSTR'; 


RETURN true; 
END; 

END MODULE; 
CREATE COMPUTE MODULE "ACIF_AUDIT_1_5_Insert audit record" 
CREATE FUNCTION main() RETURNS BOOLEAN BEGIN 
SET OutputRoot = InputRoot; 


Declare refAONDataRoot  REFERENCE To InputBody.MSG; 
Declare refSOAPDataRoot  REFERENCE TO InputBody."SOAP-ENV:Envelope"; 
Declare MSGChar   CHAR; 
Declare MSGBlob   BLOB; 
DECLARE intSQLCode  INTEGER; 
DECLARE chrSQLErrorText  CHAR; 

/* Added by Shailen **/ 
DECLARE uuid  CHAR; 
DECLARE msid  INT; 
DECLARE mType  CHAR; 
DECLARE srcApp  CHAR; 
Declare msgRef  REFERENCE TO InputBody; 

If FIELDNAME(refAONDataRoot.AONHEADER) = 'AONHEADER' Then 

    Set MSGBlob = BITSTREAM(refAONDataRoot); 
    Set MSGChar = CAST(MSGBlob As CHAR CCSID InputRoot.MQMD.CodedCharSetId); 
    Set msid = refAONDataRoot.AONHEADER.MSID; 

    IF refAONDataRoot.APP_DATA.APP_HEADER.UUID IS NOT NULL THEN 
     SET uuid = refAONDataRoot.APP_DATA.APP_HEADER.UUID; 
    ELSE 
     /* Let check for MESSAGE_ID - BRIDGE Messages */ 
     IF FIELDNAME(refAONDataRoot.APP_DATA.AON_APPLICATION_MESSAGE.HEADER.MESSAGE_ID) IS NOT NULL THEN 
      SET uuid = refAONDataRoot.APP_DATA.AON_APPLICATION_MESSAGE.HEADER.MESSAGE_ID; 
      SET msid = 9999; 
     END IF; 
    END IF; 

IF FIELDNAME(refAONDataRoot.APP_DATA.APP_HEADER.MESSAGE_TYPE) IS NOT NULL THEN 
    SET mType = refAONDataRoot.APP_DATA.APP_HEADER.MESSAGE_TYPE; 
ELSE 
    /* Let check another location - historical message type location */ 
    IF 

FIELDNAME(refAONDataRoot.APP_DATA.AON_APPLICATION_MESSAGE.HEADER.MESSAGE_TYPE) IS NOT NULL THEN 
      SET mType = refAONDataRoot.APP_DATA.AON_APPLICATION_MESSAGE.HEADER.MESSAGE_TYPE; 
     END IF; 
    END IF; 

    Insert Into Database.MESSAGE_AUDIT (UUID,MSID,MESSAGE_TYPE,SOURCE_APPLICATION,MQ_HEADER,MESSAGE_BODY) 
    Values (uuid,msid,mType,refAONDataRoot.AONHEADER.APPLICATION_NAME,'',MSGChar); 

/* 08-11-2004:The following assumes that the flow will throw an error on an database error. 
* As part of this change the flow is being changed to do this, otherwise the message is just thrown away. 

RETURN FALSE; 
*/ 
ElseIf FIELDNAME(refSOAPDataRoot."SOAP-ENV:Header") = 'SOAP-ENV:Header' Then 

    Set MSGBlob = BITSTREAM(refSOAPDataRoot); 
    Set MSGChar = CAST(MSGBlob As CHAR CCSID InputRoot.MQMD.CodedCharSetId); 

    Insert Into Database.MQUSER.MESSAGE_AUDIT (UUID,MSID,MESSAGE_TYPE,SOURCE_APPLICATION,MQ_HEADER,MESSAGE_BODY) 
    Values (refSOAPDataRoot."SOAP-ENV:Header".MessageHeader.uuid,'',refSOAPDataRoot."SOAP-ENV:Header".MessageHeader.messageType,'','',MSGChar); 
    /* 08-11-2004:The following assumes that the flow will throw an error on an database error. 
* As part of this change the flow is being changed to do this, otherwise the message is just thrown away. 
RETURN FALSE; 
*/ 
ElseIf FIELDNAME(InputBody.AON_APPLICATION_MESSAGE) IS NOT NULL Then 
    /* This is to audit the message from AME to bridge. 
    * The MESSAGE ID is effectively the UUID for this message. 
    */ 
    MOVE msgRef TO InputBody.AON_APPLICATION_MESSAGE; 
    Set MSGBlob = BITSTREAM(msgRef); 
    Set MSGChar = CAST(MSGBlob As CHAR CCSID InputRoot.MQMD.CodedCharSetId); 

    Set msid = '9999'; 
    Set mType = 'Unset'; 
    Set srcApp = 'Unset'; 

    IF FIELDNAME(msgRef.HEADER.MESSAGE_ID) IS NOT NULL THEN 
     SET uuid = msgRef.HEADER.MESSAGE_ID; 
    END IF; 

    IF FIELDNAME(msgRef.HEADER.MSID) IS NOT NULL THEN 
     SET msid = CAST(msgRef.HEADER.MSID AS INT); 
    END IF; 

    IF FIELDNAME(msgRef.HEADER.MESSAGE_TYPE) IS NOT NULL THEN 
     SET mType = msgRef.HEADER.MESSAGE_TYPE; 
    END IF; 

    IF FIELDNAME(msgRef.HEADER.SENDER) IS NOT NULL THEN 
     SET srcApp = msgRef.HEADER.SENDER; 
    END IF; 

    Insert Into Database.MESSAGE_AUDIT (UUID,MSID,MESSAGE_TYPE,SOURCE_APPLICATION,MQ_HEADER,MESSAGE_BODY) 
    Values (uuid,msid,mType,srcApp,'',MSGChar); 

    /* 08-11-2004:The following assumes that the flow will throw an error on an database error. 
    * As part of this change the flow is being changed to do this, otherwise the message is just thrown away. 
    RETURN FALSE; 
    */ 
ElseIf FIELDNAME(InputBody.msg.header.application_name) IS NOT NULL Then 
    /* Then assume this is an ATLAS message. 
    * The MESSAGE ID is effectively the UUID for this message. 
    */ 
    MOVE msgRef TO InputBody.msg; 
    Set MSGBlob = BITSTREAM(msgRef); 
    Set MSGChar = CAST(MSGBlob As CHAR CCSID InputRoot.MQMD.CodedCharSetId); 

    Set srcApp = msgRef.header.application_name; 

    IF FIELDNAME(msgRef.header.msid) IS NOT NULL Then 
     Set msid = msgRef.header.msid; 
    ELSE 
     Set msid = '9997'; 
    END IF; 

    Set mType = 'Unset:ATLAS_MESSAGE'; 
    Set uuid = UUIDASCHAR; 

    Insert Into Database.MESSAGE_AUDIT (UUID,MSID,MESSAGE_TYPE,SOURCE_APPLICATION,MQ_HEADER,MESSAGE_BODY) 
    Values (uuid,msid,mType,srcApp,'',MSGChar); 

    /* 08-11-2004:The following assumes that the flow will throw an error on an database error. 
    * As part of this change the flow is being changed to do this, otherwise the message is just thrown away. 
    RETURN FALSE; 
    */  
Else 
    /* We have an XML message, but we do not know what it is. Lets treat is a a NONXML Message. 
    */ 
    RETURN TRUE; 
End If; 

/* 
* Return FALSE - this means that everything was okay in this case. We have wired up the TRUE terminal to handle the case when we have 
* an XML message, but one that is not recognised. NB Non XML messages will cause an error because the MQINPUT node is expecting an XML 
* message. 
*/ 
RETURN FALSE; 

END; 

END MODULE; 

브로커 로그 :

를 다음과 같이

CREATE COMPUTE MODULE "WriteNonXMLToAudit_1_0_WriteNonXMLToAudit" 
CREATE FUNCTION main() RETURNS BOOLEAN BEGIN 
    SET OutputRoot = InputRoot; 

    DECLARE ver CHAR; 
    DECLARE codeName CHAR; 

    SET ver = '1_0_2'; 
    SET codeName = 'WriteNonXMLToAudit.' || 'Version:' || ver; 

    DECLARE aonMSG REFERENCE To "OutputRoot"."BLOB"; 
    DECLARE appError REFERENCE To InputExceptionList; 

    DECLARE msid INTEGER; 
    DECLARE messageType CHAR; 

    DECLARE sourceApplication CHAR; 

    DECLARE mqHdrBlob BLOB; 
    DECLARE mqHdrChar CHAR; 

    DECLARE msgBlob BLOB; 
    DECLARE msgChar CHAR; 
    DECLARE msgUUID CHAR; 

    SET OutputRoot.MQMD.Format = 'MQSTR '; 
    SET OutputRoot.MQMD.CodedCharSetId = 819; 
    SET OutputRoot.MQMD.Encoding = 273; 
    SET OutputRoot."MQRFH2" = NULL; 

    MOVE aonMSG TO "OutputRoot"."BLOB"; 

    SET msgChar = aonMSG; 

    SET messageType = 'NON_STANDARD_MESSAGE'; 
    SET msid = 9998; 

    SET msgUUID = UUIDASCHAR; 
    SET sourceApplication = RTRIM(OutputRoot.MQMD.PutApplName); 

    SET msgChar = CAST(OutputRoot."BLOB"."BLOB" As CHAR CCSID 819 ENCODING OutputRoot.MQMD.Encoding); 

    Insert Into Database.Message_Audit (UUID, MSID, Message_Type, Source_Application, Message_Body) 
    Values (SUBSTRING(msgUUID FROM 1 FOR 35), 
    msid, 
    SUBSTRING(messageType FROM 1 FOR 29), 
    SUBSTRING(sourceApplication FROM (LENGTH(sourceApplication) - 9) FOR 10), 
    msgChar); 

    IF SQLCODE <> 0 THEN 
     RETURN FALSE; 
    END IF; 

    RETURN TRUE; 

END; 

END MODULE; 

메인 흐름은

Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP2232E: Error detected whilst handling a previous error in node 'ACIF_AUDIT_1_5.ACIF_ERROR_01'. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/DataFlowEngine/ImbDataFlowNode.cpp: 893: ImbDataFlowNode::logExceptionList: ComIbmMQOutputNode: ACIF_AUDIT_1_5#FCMComposite_1_2 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP2230E: Error detected whilst processing a message in node 'ACIF_AUDIT_1_5.Insert audit record'. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/DataFlowEngine/ImbComputeNode.cpp: 489: ImbComputeNode::evaluate: ComIbmComputeNode: ACIF_AUDIT_1_5#FCMComposite_1_4 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP2488E: (.ACIF_AUDIT_1_5_Insert audit record.main, 16.1) Error detected whilst executing the SQL statement 'DECLARE refAONDataRoot REFERENCE TO InputBody.MSG;'. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/DataFlowEngine/ImbRdl/ImbRdlStatementGroup.cpp: 643: SqlStatementGroup::execute: ComIbmComputeNode: ACIF_AUDIT_1_5#FCMComposite_1_4 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP2498E: (.ACIF_AUDIT_1_5_Insert audit record.main, 16.39) : An error occurred when navigating to path element '2' of the field reference at the given location. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/DataFlowEngine/ImbRdl/ImbRdlFieldRef.cpp: 1916: SqlFieldReference::navigateAbsoluteToFirst: ComIbmComputeNode: ACIF_AUDIT_1_5#FCMComposite_1_4 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP5009E: XML Parsing Errors have occurred. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/MTI/MTIforBroker/GenXmlParser2/XmlImbParser.cpp: 720: XmlImbParser::parseRightSibling: : 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP5004E: An XML parsing error 'Invalid character (Unicode: 0x2) ' occurred on line 1 column 441 when parsing element 'app_data'. Internal error codes are '196' and ''. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/MTI/MTIforBroker/GenXmlParser2/XmlBrokerAsgardParser.cpp: 730: XmlBrokerAsgardParser::error: : 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP2628E: Exception condition detected on input node 'ACIF_AUDIT_1_5.ACIF_AUDIT_01'. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/DataFlowEngine/ImbCommonInputNode.cpp: 1912: ImbCommonInputNode::run: ComIbmMQInputNode: ACIF_AUDIT_1_5#FCMComposite_1_5 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP2230E: Error detected whilst processing a message in node 'ACIF_AUDIT_1_5.ACIF_ERROR_01'. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/DataFlowEngine/ImbMqOutputNode.cpp: 864: ImbMqOutputNode::evaluate: ComIbmMQOutputNode: ACIF_AUDIT_1_5#FCMComposite_1_2 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP5010E: XML Writing Errors have occurred. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/MTI/MTIforBroker/GenXmlParser2/XmlImbParser.cpp: 443: XmlImbParser::refreshBitStreamFromElementsInner: ComIbmMQInputNode: ACIF_AUDIT_1_5#FCMComposite_1_5 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15201]: (UKS06.ACIF_001)[35]BIP5005E: There are 2 top level elements 'msg,MSG' in the document. : UKS06.7aaf0524-3801-0000-0080-9e3a13c0b2a4: /build/S700_P/src/MTI/MTIforBroker/GenXmlParser2/XmlImbParser.cpp: 954: XmlImbParser::checkForBodyElement: : 
Mar 25 14:50:31 ukvmgstg008 WebSphere Broker v7005[15195]: (UKS06.CONCERT_001)[7]BIP2648E: Message backed out to a queue; node 'ACIF_AUDIT_1_5.ACIF_AUDIT_01'. : UKS06.d0420624-3801-0000-0080-83fda0200698: /build/S700_P/src/DataFlowEngine/ImbMqInputNode.cpp: 2122: ImbCommonInputNode::eligibleForBackout: ComIbmMQInputNode: ACIF_AUDIT_1_5#FCMComposite_1_5 

답변

2

예외 목록을 확보하고 오류의 근본 원인을 찾아야합니다. Catch of Fail 터미널이없는 경우 오류 메시지는 syslog/이벤트 뷰어에 있습니다.

그러나 오류 처리 기능이있는 경우 예외의 근본 원인을보고하는 적절한 방법으로 예외 목록을 처리해야합니다.

정말로 방해가된다면 사용자 트레이스를 가져 와서 영향을받는 계산 노드를 실행하여 실패 지점을 확인하고 시도해 볼 수 있습니다.

문제가 db 또는 db 드라이버 문제 인 경우 throw되는 BIP 메시지에는 db 공급 업체 설명서에서 참조 할 수있는 SQLState 및 네이티브 오류 코드가 있어야합니다.

+0

브로커 로그에 다음과 같이 표시됩니다. – HyperioN

1

로그에서 다음과 같이 표시됩니다. BIP5005E : 문서에 'msg, MSG'라는 두 개의 최상위 요소가 있습니다.

유효한 XML 메시지는 하나의 최상위 요소 만 가질 수 있습니다. 나는 오타라고 가정하고 있습니다. 수정하고 다시 시도하십시오.

제공된 로그에는 사용자의 ESQL에는 문제가없고 XML 구문 분석 만 표시됩니다. 이로 인해 나머지 흐름이 실행되지 않거나 예상대로 실행되지 않을 수 있습니다. 사용자 추적은 브로커 로그보다 더 중요합니다.

+0

안녕하세요. 답장을 보내 주셔서 감사합니다. – HyperioN

+0

응용 프로그램을 보내서 대기열에 넣는 XML 메시지의 최상위 태그는 이지만 Mainflow의 코드는 다음과 같습니다. – HyperioN

+0

refAONDataRoot REFERENCE To InputBody.MSG; – HyperioN