/// <summary> /// DoFinalize sends outputs to the database, sets final run status and /// warnings and/or errors in the job and process. /// </summary> /// <param name="stest"></param> /// <param name="job"></param> /// <param name="process"></param> protected void DoFinalize(sinter.ISimulation stest, IJobConsumerContract job, IProcess process) { int runStatus = (int)stest.runStatus; process.SetStatus(runStatus); IDictionary <string, Object> myDict = null; JObject outputDict; try { var superDict = stest.getOutputs(); outputDict = (JObject)superDict["outputs"]; // HACK: Inefficient Just making it work w/o covariance issues string data = outputDict.ToString(Newtonsoft.Json.Formatting.None); myDict = JsonConvert.DeserializeObject <IDictionary <string, Object> >(data); } catch (Exception ex) { Debug.WriteLine(ex.Message, "SinterConsumer.DoFinalize"); process.Output = new Dictionary <string, Object>() { { "exception", ex.Message } }; job.Error(String.Format("Failed to retrieve the outputs: {0} {1}", ex.Message, ex.StackTrace)); return; } Debug.WriteLine("Outputs: " + myDict, this.GetType()); process.Output = myDict; if (stest.runStatus == sinter.sinter_AppError.si_OKAY) { job.Success(); } else if (stest.runStatus == sinter.sinter_AppError.si_SIMULATION_ERROR) { Debug.WriteLine("Error: si_SIMULATION_ERROR", "SinterConsumerRun.DoFinalize"); sim.closeSim(); sim = null; job.Error(String.Join(",", stest.errorsBasic())); } //else if (stest.runStatus == sinter.sinter_AppError.si_SIMULATION_WARNING) //{ // job.Error(String.Join(",", stest.warningsBasic())); //} else if (stest.runStatus == sinter.sinter_AppError.si_COM_EXCEPTION) { Debug.WriteLine("Error: si_COM_EXCEPTION", "SinterConsumerRun.DoFinalize"); job.Error("COM Exception, Server was Terminated"); } else if (stest.runStatus == sinter.sinter_AppError.si_SIMULATION_NOT_RUN) { Debug.WriteLine("Error: si_SIMULATION_NOT_RUN", "SinterConsumerRun.DoFinalize"); job.Error("Simulation was not Run"); } else { Debug.WriteLine("Error: Unknown", "SinterConsumerRun.DoFinalize"); job.Error(string.Format("Aspen Process Status unknown code {0}.", (int)stest.runStatus)); } }
/// <summary> /// DoFinalize sends outputs to the database, sets final run status and /// warnings and/or errors in the job and process. /// </summary> /// <param name="stest"></param> /// <param name="job"></param> /// <param name="process"></param> protected virtual void DoFinalize(sinter.ISimulation stest, IJobConsumerContract job, IProcess process) { int runStatus = (int)stest.runStatus; process.SetStatus(runStatus); IDictionary <string, Object> myDict = null; JObject outputDict; try { if (stest.runStatus == sinter.sinter_AppError.si_OKAY || stest.runStatus == sinter.sinter_AppError.si_SIMULATION_WARNING) { var superDict = stest.getOutputs(); outputDict = (JObject)superDict["outputs"]; // HACK: Inefficient Just making it work w/o covariance issues string data = outputDict.ToString(Newtonsoft.Json.Formatting.None); myDict = JsonConvert.DeserializeObject <IDictionary <string, Object> >(data); } else { Debug.WriteLine(String.Format("Sinter runstatus={0}, did not retrieve outputs.", stest.runStatus), "SinterConsumer.DoFinalize"); } } catch (Exception ex) { Debug.WriteLine(ex.Message, "SinterConsumer.DoFinalize"); process.Output = new Dictionary <string, Object>() { { "exception", ex.Message } }; if (job.IsTerminated()) { throw new TerminateException("Job was terminated by producer"); } job.Error(String.Format("Failed to retrieve the outputs: {0} {1}", ex.Message, ex.StackTrace)); return; } Debug.WriteLine("Outputs: " + myDict, this.GetType()); process.Output = myDict; if (stest.runStatus == sinter.sinter_AppError.si_OKAY) { job.Success(); } else if (stest.runStatus == sinter.sinter_AppError.si_SIMULATION_ERROR) { var msg = String.Join(",", stest.errorsBasic()); Debug.WriteLine("Error: si_SIMULATION_ERROR", "SinterConsumerRun.DoFinalize"); Debug.WriteLine(msg, "SinterConsumerRun.DoFinalize"); // Truncate the msg if it's more than 4000 characters. // The last 4000 characters are more interesting for debugging. if (msg.Length > 4000) { msg = msg.Substring(msg.Length - 4000); } job.Error(String.Format("Error: si_SIMULATION_ERROR: {0}", msg)); if (sim != null) { Debug.WriteLine("2) Simulation is not Null", "SinterConsumerRun.DoFinalize()"); sim.closeSim(); if (sim != null) { KillProcessAndChildren(sim.ProcessID); } sim = null; //sim.terminate(); } } else if (stest.runStatus == sinter.sinter_AppError.si_SIMULATION_WARNING) { job.Message(String.Join(",", stest.warningsBasic())); job.Success(); } else if (stest.runStatus == sinter.sinter_AppError.si_COM_EXCEPTION) { Debug.WriteLine("Error: si_COM_EXCEPTION", "SinterConsumerRun.DoFinalize"); job.Error("COM Exception, Server was Terminated"); } else if (stest.runStatus == sinter.sinter_AppError.si_SIMULATION_NOT_RUN) { Debug.WriteLine("Error: si_SIMULATION_NOT_RUN", "SinterConsumerRun.DoFinalize"); job.Error("Simulation was not Run"); } else { Debug.WriteLine("Error: Unknown", "SinterConsumerRun.DoFinalize"); job.Error(string.Format("Aspen Process Status unknown code {0}.", (int)stest.runStatus)); } }