M
mparish
Guest
Including a rule flow in another one only works if they both use the same vocabulary. If you want to invoke one decision service that has a different vocabulary from within another decision service then an extended operator or service call out is the way to go. The called decision service does not need to be on the same server. It can be executed in-process as shown below. Here’s a simple generic example as an extended operator that uses in-process execution. You will need to construct and pass in an XML SOAP message as the input. You will also need to parse the response to extract the values of interest and any messages Using JSON and REST would probably be simpler public class Corticon implements ICcStandAloneExtension{ /** * callCorticon makes an in - process call to the specified decision service * The decisionServicePath should point to an erf file * The XML request should conform to the WSDL for the decision service * The return value is the XML response from the decision service * @param decisionServiceName * @param decisionServicePath * @param XMLRequest * @return */ public static String callCorticon(String decisionServiceName, String decisionServicePath, String XMLRequest, Boolean enableUpdate) { int minPoolSize = 1; int maxPoolSize = 1; // boolean enableUpdate = true; String msgStyle = ICcServer. XML_HIER_STYLE ; try { ICcServer iServer = CcServerFactory. getCcServer (); if (!iServer.isDecisionServiceDeployed(decisionServiceName)){ iServer.addDecisionService(decisionServiceName, decisionServicePath, enableUpdate, minPoolSize, maxPoolSize, msgStyle); } return ( "Corticon Result = " + iServer.execute(XMLRequest)); } catch (Exception e) { return "Corticon call to " + decisionServiceName + " failed" + e;} //End of try call corticon } // End of method callCorticon In order to make a REST call to a decision service that is already deployed on a server you could wrap the following in an extended operator or service call out. You will still need to pass the input values to the decision service and you will still need to get the results and messages back. /* Summary of steps * 1. CREATE PAYLOAD: * 2. CREATE HTTP REQUEST * 3. PREPARE THE HTTP PPOST Using Apache HTTP libs * 4. DISPLAY THE REQUEST JSON (only needed for debugging) * 5. INVOKE CORTICON * 6. DISPLAY THE RESPONSE JSON (only needed for debugging) * 7. EXTRACT THE RESULTS * 8. DISPLAY DEBUGGING INFO (only needed for debugging) */ public class restInvocationTest { public restInvocationTest() { } public static void main (String[] args) { try { executeREST (); } catch (Exception e) { System. out .println(e.getMessage()); } } private static void executeREST() throws Exception { String ccServerURL = " corticon-demo.dyndns.org:8860/.../execute" ; // 1. CREATE PAYLOAD: //SQL to get values JSONObject applicantJSON = new JSONObject(); // create a JSON object for the Applicant entity applicantJSON.put( "skydiver" , "false" ); // set its isSkydiver attribute applicantJSON.put( "age" , "25" ); // set its age attribute JSONObject metadataJSON = new JSONObject(); // create a JSON object for metadata for Person metadataJSON.put( "#type" , "Applicant" ); // set its #type attribute to "Applicant" applicantJSON.put( "__metadata" , metadataJSON); // add the metadata object to the applicant object JSONArray ccObjects = new JSONArray(); // create an array of JSON objects ccObjects.put(applicantJSON); // add the applicant to it JSONObject ccRequestObj = new JSONObject(); // create a JSON request object ccRequestObj.put( "Objects" , ccObjects); // set its objects attribute to the array of ccObjects // 2. CREATE HTTP REQUEST HttpEntity ccRequestEntity = EntityBuilder. create ().setContentType(ContentType. APPLICATION_JSON ).setText(ccRequestObj.toString()).build(); // 3. PREPARE THE HTTP PPOST Using Apache HTTP libs HttpClient client = HttpClientBuilder. create ().build(); HttpPost post = new HttpPost(ccServerURL); post.setHeader( "dsname" , "Skydiver" ); // might also set version or effective date post.setEntity(ccRequestEntity); // 4. DISPLAY THE REQUEST JSON before invoking Corticon (only needed for debugging) // [this is to display the request on the console] BufferedReader rd = new BufferedReader ( new InputStreamReader(post.getEntity().getContent())); StringBuffer result = new StringBuffer(); String line = "" ; while ((line = rd.readLine()) != null ) {result.append(line);} String postJSONString = result.toString(); System. out .println( "\nccRequestObj.toString():\n" +ccRequestObj.toString()); // Payload // 5. INVOKE CORTICON HttpResponse response = client.execute(post); // 6. DISPLAY THE RESPONSE JSON (only needed for debugging) rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); result = new StringBuffer(); line = "" ; while ((line = rd.readLine()) != null ) {result.append(line);} String responseJSONString = result.toString(); // 7. EXTRACT THE RESULTS: riskRating value from the Corticon response JSON JSONTokener tokener = new JSONTokener(responseJSONString); JSONObject respJSON = new JSONObject(tokener); JSONArray objects = respJSON.getJSONArray( "Objects" ); JSONObject messages = respJSON.getJSONObject( "Messages" ); // Get object values String riskRating = objects.getJSONObject(0).getString( "riskRating" ); String age = objects.getJSONObject(0).getString( "age" ); String isSkydiver = objects.getJSONObject(0).getString( "skydiver" ); // Get message values String message = messages.getJSONArray( "Message" ).getJSONObject(0).getString( "text" ); String severity = messages.getJSONArray( "Message" ).getJSONObject(0).getString( "severity" ); String entityRef = messages.getJSONArray( "Message" ).getJSONObject(0).getString( "entityReference" ); // Display results System. out .println( "\nRESULTS --------------------------------------------------" ); System. out .println( "\nRisk: " + riskRating + " for age = " + age + " and skydiver = " + isSkydiver); System. out .println( "Message: " + message); System. out .println( "Severity: " + severity); System. out .println( "Entity Reference: " + entityRef); // 8. DEBUGGING (only needed for debugging) System. out .println( "\nDEBUGGING --------------------------------------------------" ); System. out .println( "\nccRequestObj.toString():\n" +ccRequestObj.toString()); // Payload System. out .println( "\nccRequestEntity.toString():\n" + ccRequestEntity.toString()); // Request entity System. out .println( "\nRequestJSONString:\n" + postJSONString); // Request JSON System. out .println( "\nResponse:\n" + response.toString()); // Shows just a response summary NOT the response JSON System. out .println( "\nResponseJSONString:\n" + responseJSONString); // Response //9. NOTES /* You can pass multiple Person objects in a single payload but then you will then need to use the entityReference to ensure that the correct message is matched up with the corresponding Person. Also if the rules return multiple messages for a single Person then you will need to iterate over the messages to extract all of them */ } }
Continue reading...
Continue reading...