【问题标题】:SOAP request losing value in Integration Broker (PT8.52.14)SOAP 请求在集成代理中失去价值 (PT8.52.14)
【发布时间】:2015-02-10 09:05:31
【问题描述】:

我设置了一个 document 消息,以便在同步服务操作中使用它。我已经发布了这个服务,我正在使用SOAPui 和内置的服务操作测试器,可以直接通过 PeopleTools>Integration Broker>Service Utilities>Service Operation Tester 菜单获得。

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

注意:

  • Request 和 Response 是同一条消息。
  • 文档中的每个字段都有长度和类型集。
  • 基于非行集的消息没有问题
  • 我正在使用 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>

在监视器中查看原始传入消息时,传入值 EventNamePerfsDate 将消失。但这并不一致,因为在重新启动 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 的值为 empty

对此有何反馈?

【问题讨论】:

    标签: web-services soap peoplesoft


    【解决方案1】:

    您似乎没有从请求消息中正确检索值。下面是我如何从 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 将返回 "This method can only be used by nonrowset-based messages.(2,852)" ,参考 GetXmlDoc();
    • 我刚刚意识到您正在处理基于行集的消息传递。抱歉 - 我应该更仔细地阅读您的问题。
    • 您需要使用 GenXMLString() 来创建包含 XML 数据的字符串对象,而不是 GetXmlDoc。然后,您可以解析 XML 并查看消息中出现的内容。我不确定是什么导致了您所描述的问题,但我想这是因为您将消息视为非基于行集的消息。您应该在某处使用记录和行集对象类型,因为这是您通常处理它们的方式。
    • 它也不是基于 Rowset 的消息,而是 Document Message,这是 Ptools 8.50 引入的一种新类型。文档允许您描述数据的结构,并获得一个方便的对象来轻松操作它......如果它可以工作:)
    猜你喜欢
    • 2015-08-05
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多