Запрос SOAP теряет значение в Integration Broker (PT8.52.14)

Я настроил сообщение document, чтобы использовать его в синхронной операции службы. Я опубликовал эту службу и использую SOAPui, а также встроенный инструмент Service Operation Tester, доступный непосредственно через меню 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