static void Run() { IConsumerRegistrationContract cc = Turbine.Consumer.AppUtility.GetConsumerRegistrationContract(); IConsumerRun run = Turbine.Consumer.AppUtility.GetConsumerRunContract(); IJobQueue queue = cc.Register(run); IJobConsumerContract contract = queue.GetNext(run); jobs_available = (contract != null); if (jobs_available == false) { return; } try { contract.Setup(); } catch (System.Data.Entity.Core.OptimisticConcurrencyException ex) { var msg = String.Format( "Setup Failed({0}): OptimisticConcurrencyException, {1}", contract.Id, ex.Message); Debug.WriteLine(msg, label); throw; } catch (Turbine.Lite.Web.Resources.Contracts.InvalidStateChangeException ex) { var msg = String.Format( "Setup Failed({0}): InvalidStateChangeException, {1}", contract.Id, ex.Message); Debug.WriteLine(msg, label); throw; } Debug.WriteLine(String.Format("{0} Working Directory: {1}", DateTime.Now.ToString(), contract.Process.WorkingDirectory), label); // Execute Job try { contract.Running(); } catch (Exception ex) { contract.Error(String.Format( "threadid:{0}, machine:{1}, exception:{2}", Thread.CurrentThread.ManagedThreadId, System.Environment.MachineName, ex.Message) ); throw; } IProcess process = contract.Process; var inputDict = process.Input; var outputDict = new Dictionary <string, Object>(); foreach (var key in inputDict.Keys.ToArray <string>()) { if (inputDict[key] == null) { continue; } outputDict[key] = String.Format("{0} OUTPUT", inputDict[key]); process.AddStdout(String.Format("Add Output {0}\n", key)); } process.AddStdout("Fake Job Completed"); process.Output = outputDict; contract.Success(); }
public void TestSessionProducerConsumerContracts() { // producers ISessionProducerContract producer = new AspenSessionProducerContract(); Guid session_id = producer.Create(); Assert.IsNotNull(session_id); ISimulationProducerContract simulation_contract = AspenSimulationContract.Create("testX", "AspenPlus"); var bytes = File.ReadAllBytes("mea-sinter.txt"); Assert.IsNotNull(bytes); Assert.IsTrue(bytes.Length > 0); System.Threading.Thread.Sleep(100); simulation_contract.UpdateInput("configuration", bytes, "plain/text"); bytes = File.ReadAllBytes("mea.bkp"); Assert.IsNotNull(bytes); Assert.IsTrue(bytes.Length > 0); System.Threading.Thread.Sleep(100); simulation_contract.UpdateInput("aspenfile", bytes, "plain/text"); IJobProducerContract job_producer_contract = simulation_contract.NewJob(session_id, false, true); job_producer_contract = simulation_contract.NewJob(session_id, false, true); IConsumerRegistrationContract contract = Turbine.Consumer.AppUtility.GetConsumerRegistrationContract(); contract.Register(); IJobConsumerContract job = contract.Queue.GetNext(); Assert.IsNull(job); job_producer_contract.Submit(); job = contract.Queue.GetNext(); Assert.IsNotNull(job); Assert.AreEqual(job.Id, job_producer_contract.Id); job.Setup(); SimpleFile backup = null; SimpleFile config = null; foreach (var f in job.GetSimulationInputFiles()) { if (f.name == "configuration") { config = f; } else { backup = f; } } Assert.AreEqual(config.name, "configuration"); String filename = SinterHelperFunctions .getBackupFilename(System.Text.Encoding.ASCII.GetString(config.content)); Assert.AreEqual(backup.name, "aspenfile"); // NEED TO SET INPUT Before Setting to Run //j try { job.Running(); Assert.Fail("Job.Process.Input Must be set before setting job to run"); } catch (InvalidStateChangeException) {} job.Process.Input = new Dictionary <string, Object>(); job.Running(); job.Success(); job = contract.Queue.GetNext(); Assert.IsNull(job); }
/// <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)); } }