/// <summary>Called by a runner process to signal end of job</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnEndJob(object sender, SocketServer.CommandArgs args) { try { EndJobArguments arguments = args.obj as EndJobArguments; JobCompleteArgs jobCompleteArguments = new JobCompleteArgs(); jobCompleteArguments.job = runningJobs[arguments.key]; if (arguments.errorMessage != null) { jobCompleteArguments.exceptionThrowByJob = new Exception(arguments.errorMessage); } lock (this) { if (JobCompleted != null) { JobCompleted.Invoke(this, jobCompleteArguments); } runningJobs.Remove(arguments.key); } server.Send(args.socket, "OK"); } catch (Exception err) { errors += err.ToString() + Environment.NewLine; } }
/// <summary>Called by a runner process to get the next job to run.</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnGetJob(object sender, SocketServer.CommandArgs args) { try { IRunnable jobToRun; Guid jobKey; lock (this) { jobToRun = jobs.GetNextJobToRun(); jobKey = Guid.NewGuid(); runningJobs.Add(jobKey, jobToRun); } if (jobToRun == null) { server.Send(args.socket, "NULL"); } else { RunSimulation runner = jobToRun as RunSimulation; IModel savedParent = runner.SetParentOfSimulation(null); GetJobReturnData returnData = new GetJobReturnData(); returnData.key = jobKey; returnData.job = runner; server.Send(args.socket, returnData); runner.SetParentOfSimulation(savedParent); } } catch (Exception err) { errors += err.ToString() + Environment.NewLine; } }
/// <summary>Called by the client to get the next job to run.</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnError(object sender, SocketServer.CommandArgs args) { string errorMessage = args.obj as string; internalExceptions.Add(new Exception(errorMessage)); server.Send(args.socket, "OK"); }
/// <summary>Called by a runner process to send its output data.</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnTransferData(object sender, SocketServer.CommandArgs args) { try { if (args.obj is TransferReportData) { var transferData = args.obj as TransferReportData; var runSimulation = runningJobs[transferData.key] as RunSimulation; runSimulation.DataStore.Writer.WriteTable(transferData.data); } else if (args.obj is TransferDataTable) { var transferData = args.obj as TransferDataTable; var runSimulation = runningJobs[transferData.key] as RunSimulation; runSimulation.DataStore.Writer.WriteTable(transferData.data); } else { throw new Exception("Invalid socket transfer method."); } server.Send(args.socket, "OK"); } catch (Exception err) { errors += err.ToString() + Environment.NewLine; } }
/// <summary>Called by the client when a socket fails to get a job</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnGetJobFailed(object sender, SocketServer.CommandArgs args) { Job jobToRun = null; lock (this) { if (jobs.Count > 0) { jobToRun = jobs[0]; jobs.RemoveAt(0); } } if (jobToRun == null) { server.Send(args.socket, "NULL"); } else { GetJobReturnData returnData = new GetJobReturnData(); returnData.key = jobToRun.Key; returnData.job = jobToRun.RunnableJob; server.Send(args.socket, returnData); } }
/// <summary>Called by the client to get the next job to run.</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnGetJob(object sender, SocketServer.CommandArgs args) { Job jobToRun = null; lock (this) { // Free up memory be removing all child models on completed jobs. // This helps the garbage collector when there are many jobs. foreach (JobManager.Job job in jobs) { if (job.IsCompleted && job.RunnableJob is Simulation) { (job.RunnableJob as Simulation).Children.Clear(); } } jobToRun = jobs.Find(job => !job.IsRunning && !job.isCompleted && typeof(Simulation).IsAssignableFrom(job.RunnableJob.GetType())); if (jobToRun != null) { jobToRun.IsRunning = true; } } if (jobToRun == null) { server.Send(args.socket, "NULL"); } else { GetJobReturnData returnData = new GetJobReturnData(); returnData.key = jobToRun.Key; returnData.job = jobToRun.RunnableJob; server.Send(args.socket, returnData); } }
/// <summary>Called by the client to get the next job to run.</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnGetJob(object sender, SocketServer.CommandArgs args) { Job jobToRun = null; lock (jobs) { jobToRun = jobs.Find(job => !job.IsRunning && !job.isCompleted && typeof(Simulation).IsAssignableFrom(job.RunnableJob.GetType())); if (jobToRun != null) { jobToRun.IsRunning = true; } } if (jobToRun == null) { server.Send(args.socket, "NULL"); } else { GetJobReturnData returnData = new GetJobReturnData(); returnData.key = jobToRun.Key; returnData.job = jobToRun.RunnableJob; server.Send(args.socket, returnData); } }
/// <summary>Called by the client to send its output data.</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnTransferData(object sender, SocketServer.CommandArgs args) { lock (DataStore.TablesToWrite) { List <ReportTable> arguments = args.obj as List <ReportTable>; DataStore.TablesToWrite.AddRange(arguments); } server.Send(args.socket, "OK"); }
/// <summary>Called by the client to get the next job to run.</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnEndJob(object sender, SocketServer.CommandArgs args) { EndJobArguments arguments = args.obj as EndJobArguments; lock (this) { SetJobCompleted(arguments.key, arguments.errorMessage); } server.Send(args.socket, "OK"); }
/// <summary>Called by a runner process to send its output data.</summary> /// <param name="sender">The sender</param> /// <param name="args">The command arguments</param> private void OnTransferData(object sender, SocketServer.CommandArgs args) { try { List <TransferRowInTable> rows = args.obj as List <TransferRowInTable>; foreach (TransferRowInTable row in rows) { storageWriter.WriteRow(row.simulationName, row.tableName, row.columnNames, row.columnUnits, row.values); } server.Send(args.socket, "OK"); } catch (Exception err) { errors += err.ToString() + Environment.NewLine; } }