2015-02-10 2 views
1

Я установил сообщение , чтобы использовать его в синхронной сервисной операции. Я опубликовал эту службу, и я использую SOAPui и встроенный тестер обслуживания, доступный непосредственно через PeopleTools> Integration Broker> Service Utilities> Service Tester.Ошибка запроса SOAP в Integration Broker (PT8.52.14)

Моя проблема: когда я отправляю запрос, заполненный некоторыми значениями, а затем просматриваю его на синхронном мониторе службы, я больше их не вижу. В какой-то момент Integration Broker сбросил значения, и я не могу понять, является ли это известной ошибкой или что-то в моей настройке, которая может быть неправильной.

Примечание:

  • Запрос и ответ то же самое сообщение.
  • Каждое поле в документе имеет длину и набор типов.
  • Нет проблема с сообщением на основе Non-Rowset
  • Я использую PeopleTools 8.52.14

Мой запрос следующим образом:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nx="http://xmlns.oracle.com/Enterprise/Tools/schemas/NX_PAC.NX_IB_PERFS_EVENT.VERSION_2a"> 
    <soapenv:Header/> 
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <NX_IB_PERFS_EVENT xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/NX_PAC.NX_IB_PERFS_EVENT.VERSION_2a"> 
     <EventName>XYZ</EventName> 
     <PerfsDate>2015-02-09</PerfsDate> 
     <AverageTiming>0.0</AverageTiming> 
     <NumberOfExec>0.0</NumberOfExec> 
     <AveragePost>0.0</AveragePost> 
    </NX_IB_PERFS_EVENT> 
    </soapenv:Body> 
</soapenv:Envelope> 

поступающих значений EventName и PerfsDate отпадет при просмотре исходного входящего сообщения на мониторе. Но это не так, поскольку значения появляются после перезагрузки PIA.

Вот PeopleCode моей службы эксплуатации Handler:

method OnRequest 
    /+ &_msg as Message +/ 
    /+ Returns Message +/ 
    /+ Extends/implements PS_PT:Integration:IRequestHandler.OnRequest +/ 
    &_msg.GetDocument().GetElement("PerfsDate").value = %Date; 

    Return &_msg; 
end-method; 

я отправить обратно сообщение с запросом, и просто настроить дату на теге PerfsDate.

В ответном сообщении EventName значение пусто.

Отзывы об этом случае?

ответ

1

Похоже, что вы неправильно извлекаете значения из сообщения запроса. Ниже приведен пример того, как я хотел бы получить значения из запроса SOAP синхронном интеграционного Брокер:

method OnRequest 
    /+ &_msg as Message +/ 
    /+ Returns Message +/ 
    /+ Extends/implements PS_PT:Integration:IRequestHandler.OnRequest +/ 

    Local XmlDoc &requestXmlDoc; 
    Local XmlNode &requestRootNode; 
    Local array of XmlNode &perfsDateNodes, &avgTimingNodes; 
    Local string &perfsDateStr, &avgTimingStr; 
    Local date &perfsDate; 
    Local number &avgTiming; 

    &requestXmlDoc = &_msg.GetXmlDoc(); 
    &requestRootNode = &requestXmlDoc.DocumentElement; 

    &perfsDateNodes = &requestRootNode.GetElementsByTagName("PerfsDate"); 
    If &perfsDateNodes.Len > 0 Then 
     &perfsDateStr = &perfsDateNodes[1].NodeValue; 
     If IsDate(&perfsDateStr) Then 
      &perfsDate = DateValue(&perfsDateStr); 
     Else 
      /* some error */ 
     End-If; 
    Else 
     /* some error */ 
    End-If; 

    &avgTimingNodes = &requestRootNode.GetElementsByTagName("AverageTiming"); 
    If &avgTimingNodes.Len > 0 Then 
     &avgTimingStr = &avgTimingNodes[1].NodeValue; 
     If IsNumber(&avgTimingStr) Then 
      &avgTiming = Value(&avgTimingStr) 
     Else 
      /* some error */ 
     End-If; 
    Else 
     /* some error */ 
    End-If; 

    Return &This.CreateSOAPResponse(false, &avgTiming, &perfsDate, "No Error"); 

End-Method;   

Я хотел бы также создать отдельный метод или класс, чтобы создать ответное сообщение.

Например:

/** 
    * Create a SOAP response message based on the schema of the response message 
    * 
    */ 
method CreateSOAPResponse 
    /+ &hasError as Boolean, +/ 
    /+ &avgTiming as Number, +/ 
    /+ &perfsDate as Date, +/ 
    /+ &errorMessage as String +/ 
    /+ Returns Message +/ 
    Local SOAPDoc &responseSOAP; 
    Local XmlDoc &responseXmlDoc; 
    Local XmlNode &resultNode; 
    Local Message &responseMessage; 
    Local string &perfsDateStr, &avgTimingStr; 

    If &hasError Then 
     /* In the event of an error condition, certain response fields should be blank. */ 
     &avgTiming = ""; 
     &perfsDate = ""; 
    Else 
     &errorMessage = ""; 
    End-If; 

    /* Convert the number and date to string for response.*/ 
    If All(&avgTiming) Then 
     &avgTimingStr = NumberToString("%*.*", &avgTiming); 
    Else 
     &avgTimingStr = ""; 
    End-If; 

    If All(&perfsDate) Then 
     &perfsDateStr = DateTimeToLocalizedString(&perfsDate, "yyyy-MM-dd"); 
    Else 
     &perfsDateStr = ""; 
    End-If; 
    &responseSOAP = CreateSOAPDoc(); 
    &responseSOAP.AddEnvelope(%SOAP_Schema); 
    &responseSOAP.AddHeader(); 
    &responseSOAP.AddBody(); 
    &responseSOAP.AddMethod("SERVICE_OPERATION NAME", 0); 

    &resultNode = &responseSOAP.MethodNode; 
    &resultNode.AddAttribute("xmlns:tns", "NAMESPACE/RESPONSE_MESSAGE_NAME"); 

    &responseSOAP.AddParm("errorMessage", &errorMessage); 
    &responseSOAP.AddParm("AverageTiming", &avgTimingStr); 
    &responseSOAP.AddParm("PerfsDate", &perfsDateStr); 

    &responseMessage = CreateMessage(Operation.OPERATION_NAME_HERE, %IntBroker_Response); 
    &responseMessage.SetXmlDoc(&responseSOAP.XmlDoc); 
    Return &responseMessage; 
end-method; 

Надежда, что помогает.

+0

Это решение просто не будет работать с сообщением документа. Если вы запустите его с таким сообщением, IB отправит обратно «Этот метод может использоваться только сообщениями на основе nonrowset (2,852)», передавая GetXmlDoc(); – Telkarion

+0

Я только сейчас понял, что вы делаете набор сообщений на основе набора строк. Мои извинения - я должен был внимательно прочитать ваш вопрос. – egg0r

+0

Вместо GetXmlDoc вам нужно использовать GenXMLString() для создания строкового объекта, содержащего данные XML. Затем вы можете проанализировать XML и посмотреть, что встречается в сообщении. Я не уверен, что вызывает проблемы, которые вы описали, но я предполагаю, что это потому, что вы обрабатываете сообщения так, как будто они были сообщениями, отличными от набора строк.Вы должны использовать типы объектов записи и набора строк там где-то, так как вы обычно обрабатываете их. – egg0r

Смежные вопросы