Web services SOAP请求在集成代理中失去价值(PT8.52.14)

Web services SOAP请求在集成代理中失去价值(PT8.52.14),web-services,soap,peoplesoft,Web Services,Soap,Peoplesoft,我设置了一个文档消息,以便在同步服务操作中使用它。我已经发布了这项服务,并且正在使用内置的service Operation Tester,它可以直接通过PeopleTools>Integration Broker>service Utilities>service Operation Tester菜单获得 我的问题:当我发送一个包含一些值的请求,然后在同步服务监视器中查看它时,我再也看不到它们了。在某个时候,IntegrationBroker刷新了这些值,我无法确定这是一个已知的bug,还是我

我设置了一个文档消息,以便在同步服务操作中使用它。我已经发布了这项服务,并且正在使用内置的service Operation Tester,它可以直接通过PeopleTools>Integration Broker>service Utilities>service Operation Tester菜单获得

我的问题:当我发送一个包含一些值的请求,然后在同步服务监视器中查看它时,我再也看不到它们了。在某个时候,IntegrationBroker刷新了这些值,我无法确定这是一个已知的bug,还是我的设置中可能有错误的地方

注:

  • 请求和响应是相同的消息
  • 文档中的每个字段都有一个长度和类型集
  • 非基于行集的消息没有问题
  • 我正在使用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>
我发回请求消息,然后在标签
PerfsDate
上设置一个日期

在响应消息中,
EventName
的值为


对此有任何反馈吗?

看起来您没有从请求消息中正确检索值。下面是如何从Integration Broker同步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;

希望有帮助。

此解决方案无法处理文档消息。如果您使用这样的消息运行它,IB将发回“此方法只能由基于非行集的消息使用。(2852)”,参考GetXmlDoc();我刚刚意识到您正在执行基于行集的消息传递。很抱歉,我应该更仔细地阅读您的问题。您需要使用GenXMLString()来创建包含XML数据的字符串对象,而不是GetXmlDoc。然后可以解析XML并查看消息中出现的内容。我不确定是什么导致了您所描述的问题,但我认为这是因为您将消息视为非基于行集的消息。您应该在其中的某个地方使用记录和行集对象类型,因为这是您通常处理它们的方式。它也不是基于行集的消息,而是文档消息,是Ptools 8.50引入的一种新类型。文档允许您描述数据的结构,并获得一个方便的对象来轻松地操作它。。。但愿它能起作用:)
/**
  * 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;