EagleML Web Service - Synchronous Request

Synchronous requests are usually used for data of small volume. To make a synchronous, request prepare a synchronous RunTaskRequest message and call the RunTaskRequestSync method.

The following GenerateSyncRunTaskRequest method should be added:

//create sync runtaskrequest message for making SMF extract         private static eagleSvc.WSRunTaskRequest GenerateSyncRunTaskRequest()         {             //create WSRunTaskRequest object             var runTaskRequest = new eagleSvc.WSRunTaskRequest();             //create RunTaskRequest object             var eagleML = new eagleSvc.RunTaskRequest();             //create header section             var header = new eagleSvc.RequestMessageHeader();             //set messageId             header.messageId = new eagleSvc.MessageId { Value = "ID:SYNCSMFEXTRACT01" };             //set sendBy             header.sentBy = new eagleSvc.MessageAddress { Value = "user" };             //set sendTo , sendTo must be http://www.eagleinvsys.com/eagle_ml-2-0_default_cm_control_message             header.sendTo = new eagleSvc.MessageAddress[1] { new eagleSvc.MessageAddress { Value = "http://www.eagleinvsys.com/eagle_ml-2-0_default_cm_control_message" } };             //set timestamp             header.creationTimestamp = DateTime.Now;             eagleML.header = header;             //create taskidentifier section             var taskIdentifier = new eagleSvc.TaskIdentifier();             //set correlationId, must be unique             taskIdentifier.correlationId = new eagleSvc.CorrelationId { correlationIdScheme = "correlationIdScheme", Value = GenerateUID() };             //set businessTaskId             taskIdentifier.businessTaskId = new eagleSvc.CorrelationId { correlationIdScheme = "businessTaskIdScheme", Value = "SYNC_SMFIST_EXTRACT" };             eagleML.taskIdentifier = taskIdentifier;             //set TaskTypeEnum             eagleML.taskTypeEnum = eagleSvc.TaskTypeEnum.LOAD;             //create and set task parameters             var taskParameters = new eagleSvc.TaskParameter[4];             taskParameters[0] = new eagleSvc.TaskParameter { name = "ActionType", dataType = eagleSvc.DataTypeEnum.S, value = "EXTRACT" };             taskParameters[1] = new eagleSvc.TaskParameter { name = "StreamName", dataType = eagleSvc.DataTypeEnum.S, value = "eagle_ml-2-0_default_out_q" };             taskParameters[2] = new eagleSvc.TaskParameter { name = "FeedType", dataType = eagleSvc.DataTypeEnum.S, value = "SMFEXTRACT" };             taskParameters[3] = new eagleSvc.TaskParameter { name = "fromdate", dataType = eagleSvc.DataTypeEnum.S, value = "2014-12-04 18-00-00" };             eagleML.taskParameters = taskParameters;             //set sync field to yes             eagleML.synchronousExecution = "yes";             runTaskRequest.EagleML = eagleML;             return runTaskRequest;         }

This method matches the method for an asynchronous request, only one parameter is added:

//set sync field to yes             eagleML.synchronousExecution = "yes";

The synchronousExecution field should be set to Yes to make a synchronous request.

Next, perform an EagleML call:

eagleSvc.WSTaskStatusResponse resExtract = myClient.RunTaskRequestSync(runTaskRequest);

The result of execution is a WS TaskStatusResponse object:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eag="http://www.eagleinvsys.com/2011/wsdl/EagleML-2-0" xmlns:eag1="http://www.eagleinvsys.com/2011/EagleML-2-0"> <soapenv:Header/> <soapenv:Body> <eag:taskStatusResponse> <EagleML eaglemlVersion="2-0"  eaglemlType="TaskStatusResponse" xsi:type="eag1:TaskStatusResponse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <eag1:header> <eag1:messageId>B50CLF84H5QQYATH</eag1:messageId> <eag1:inReplyTo></eag1:inReplyTo> <eag1:sentBy>http://www.eagleinvsys.com/</eag1:sentBy> </eag1:header> <eag1:statusItem> <eag1:taskIdentifier> <eag1:correlationId correlationIdScheme="correlationIdScheme">797A9631BA32792A</eag1:correlationId> </eag1:taskIdentifier> <eag1:status>SUCCESS</eag1:status> <eag1:reason> <eag1:reasonCode></eag1:reasonCode> <eag1:description></eag1:description> <eag1:additionalData> <eag1:string><![CDATA[<EagleML   eaglemlVersion="2-0"   eaglemlType="ReferenceTransactionMessage"   eaglemlRevision="185"   xsi:schemaLocation="http://www.eagleinvsys.com/2011/EagleML-2-0 eagleml-main-2-0.xsd"   xsi:type="ReferenceTransactionMessage"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns="http://www.eagleinvsys.com/2011/EagleML-2-0"> <header> <messageId>B50CLF84HESQFXNH</messageId> <sentBy>http://www.eagleinvsys.com/</sentBy> <creationTimestamp>2015-01-22T14:28:47-05:00</creationTimestamp> </header> <referenceTransaction> <header> <objectType>GenericSMF</objectType> </header> <genericSMF> <objectType>GenericSMF</objectType> <objectId>SMF</objectId> <objectDescription>SMF</objectDescription> ….. </genericSMF> </referenceTransaction> </EagleML> ]]></eag1:string> </eag1:additionalData ><eag1:workflowState> <eag1:processCorrelationId correlationIdScheme="correlationIdScheme">797A9631BA32792A</eag1:processCorrelationId> </eag1:workflowState> </eag1:reason> </eag1:statusItem> </EagleML> </eag:taskStatusResponse> </soapenv:Body> </soapenv:Envelope>

EagleML GenericSMF document is put under the EaglML/statusItem/reason/additionalData/string element as raw text.

To deserialize raw text to object we should create a getExtractObject method.

//declare serializer for reuse    private static XmlSerializer serializer; //get SMF Generic EagleML object         private static object getExtractObject(eagleSvc.WSTaskStatusResponse res) {             //get raw data of extract from TSR             if (res != null && res.EagleML != null && res.EagleML.statusItem != null && res.EagleML.statusItem.Length > 0)             {                 if (res.EagleML.statusItem[0] != null && res.EagleML.statusItem[0].reason != null && res.EagleML.statusItem[0].reason.Length > 0)                 {                     eagleSvc.Reason reason = res.EagleML.statusItem[0].reason[0];                         if (reason != null && reason.additionalData != null && reason.additionalData.Length > 0 && reason.additionalData[0] != null)                         {                             string data = reason.additionalData[0].Item as string;                                                       if (serializer == null)                             {                                 XmlAttributes attrs = new XmlAttributes();                                 // Creates an XmlElementAttribute instance to override the                                 // field that returns ReferenceObject object. The overridden field                                 // returns Expanded object instead.                                 XmlElementAttribute attr = new XmlElementAttribute();                                 attr.ElementName = "genericSMF";                                 attr.Type = typeof(eagleSvc.GenericSMF);                                 // Adds the element to the collection of elements.                                 attrs.XmlElements.Add(attr);                                 // Creates the XmlAttributeOverrides instance.                                 XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();                                 // Adds the type of the class that contains the overridden                                 // member, as well as the XmlAttributes instance to override it                                 // with, to the XmlAttributeOverrides.                                 attrOverrides.Add(typeof(eagleSvc.ReferenceTransaction), "ReferenceBaseObject", attrs);                                 //*/                                 // create serializer with some overrides including root tag rename(new XmlRootAttribute("EagleML"))                                 serializer = new XmlSerializer(typeof(eagleSvc.EagleDocument), attrOverrides, null, new XmlRootAttribute("EagleML"), "http://www.eagleinvsys.com/2011/EagleML-2-0");                             }                             TextReader sr = new StringReader(data);                             //deserialize extract string to ReferenceTransactionMessage object                             object refTrMess = serializer.Deserialize(sr);                             return refTrMess;                         }                                    }             }             return null;         }

At first we get raw text and then we prepare an xmlSerializer, set necessary properties and overrides and execute the Deserialize method to create a SMF Generic EagleML document object.