SOAP заявка губи стойност в Integration Broker (PT8.52.14)

Настроих съобщение за документ, за да го използвам в операция на синхронна услуга. Публикувах тази услуга и използвам SOAPui и вградения тестер за операции на услугата, достъпен директно чрез менюто PeopleTools>Integration Broker>Service Utilities>Service Operation Tester.

Моят проблем: Когато изпратя заявка, пълна с някои стойности и след това я погледна в монитора за синхронна услуга, вече не ги виждам. В някакъв момент Integration Broker изчисти стойностите и не мога да разбера дали това е известна грешка или нещо в моята настройка, което може да е грешно.

Забележка :

  • Искането и отговорът са едно и също съобщение.
  • Всяко поле в документа има набор от дължина и тип.
  • Няма проблем със съобщение, базирано на набор от редове
  • Използвам 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 на моя манипулатор на операции на услугата:

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 е празна.

Някакви отзиви за това?


person Telkarion    schedule 10.02.2015    source източник


Отговори (1)


Изглежда, че не извличате правилно стойности от съобщението за заявка. По-долу е даден пример за това как бих изтеглил стойностите от синхронна SOAP заявка на Integration Broker:

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;

Надявам се това да помогне.

person egg0r    schedule 19.02.2015
comment
Това решение просто няма да работи със съобщение на документ. Ако го стартирате с такова съобщение, IB ще изпрати обратно. Този метод може да се използва само от съобщения, които не са базирани на редове. (2,852) , отнасящи се до GetXmlDoc(); - person Telkarion; 20.02.2015
comment
Току-що разбрах, че правите съобщения, базирани на набор от редове. Моите извинения - трябваше да прочета въпроса ви по-внимателно. - person egg0r; 20.02.2015
comment
Вместо GetXmlDoc, трябва да използвате GenXMLString(), за да създадете низов обект, съдържащ XML данните. След това можете да анализирате XML и да видите какво се среща в съобщението. Не съм сигурен какво причинява проблемите, които описахте, но предполагам, че е, защото третирате съобщенията така, сякаш не са базирани на набор от редове. Трябва да използвате обектни типове записи и редове някъде там, тъй като това е начинът, по който обикновено ги обработвате. - person egg0r; 20.02.2015
comment
Това също не е базирано на набор от редове съобщение, а съобщение на документ, нов тип, въведен от Ptools 8.50. Документът ви позволява да опишете структурата на вашите данни и да получите удобен обект, за да го манипулирате лесно... само ако работи :) - person Telkarion; 21.02.2015