public MqImageResultListener(JobForMq jobForMq, string inputQueuePath, BlockingCollection <SubJob> sendQueue, TimeSpan waitDuration) { _jobForMq = jobForMq; _inputQueuePath = inputQueuePath; _sendQueue = sendQueue; _waitDuration = waitDuration; _cts = new CancellationTokenSource(); _task = null; }
private string SendReplayJobRequestToMq(JobForMq job) { using (MessageQueue outQ = MqHelper.GetQ(OUTPUT_Q_PATH, QueueAccessMode.Send, null, null)) { FJobRequest fJobRequest = FJobRequest.CreateReplayRequest(job.JobId); Message m = new Message(fJobRequest); outQ.Send(m); return(m.Id); } }
private string SendJobToMq(JobForMq job) { using (MessageQueue outQ = MqHelper.GetQ(OUTPUT_Q_PATH, QueueAccessMode.Send, null, null)) { FJobRequest fJobRequest = CreateFJobRequest(job.JobId, job.SMapWorkRequest); Debug.WriteLine($"Sending request with JobId {fJobRequest.JobId} to output Q."); Message m = new Message(fJobRequest); outQ.Send(m); return(m.Id); } }
public IJob CreateJob(SMapWorkRequest sMapWorkRequest) { IJob result; if (sMapWorkRequest.RequiresQuadPrecision()) { result = new JobForMq(sMapWorkRequest); } else { result = new Job(sMapWorkRequest); } return(result); }
private SubJob CreateSubJob(FJobResult jobResult, JobForMq parentJob) { MapSectionWorkResult workResult = CreateWorkResult(jobResult); MapSectionWorkRequest workRequest = CreateMSWR(jobResult, parentJob.SMapWorkRequest.MaxIterations); MapSectionResult msr = CreateMapSectionResult(parentJob.JobId, workRequest.MapSection, workResult); SubJob subJob = new SubJob(parentJob, workRequest) { MapSectionResult = msr }; // We need to keep track if the last sub job has been sent, not received. //if (jobResult.IsFinalResult) parentJob.SetIsLastSubJob(true); return(subJob); }
private void QueueWork(BlockingCollection <SubJob> workQueue, CancellationToken ct) { do { IJob job = GetNextJob(ct); if (ct.IsCancellationRequested) { return; } if (job.RequiresQuadPrecision()) { JobForMq jobForMq = GetJobForMqFromJob(job); jobForMq.MqRequestCorrelationId = SendJobToMq(jobForMq); Debug.WriteLine($"Starting a new ImageResultListener for {jobForMq.JobId}."); MqImageResultListener resultListener = new MqImageResultListener(jobForMq, INPUT_Q_PATH, _sendQueue, WaitDuration); resultListener.Start(); jobForMq.MqImageResultListener = resultListener; jobForMq.MarkAsCompleted(); } else if (job is Job localJob) { SubJob subJob = localJob.GetNextSubJob(); if (subJob != null) { //Debug.WriteLine($"Adding subJob for JobId:{subJob.ParentJob.JobId}, the pos is {subJob.MapSectionWorkRequest.MapSection.SectionAnchor.X},{subJob.MapSectionWorkRequest.MapSection.SectionAnchor.Y}."); workQueue.Add(subJob, ct); } } else if (job is JobForMq) { throw new InvalidOperationException("Job does not require quad precision and it is not a local job."); } else { throw new ArgumentException("The IJob is neither a Job or a JobForMq."); } } while (true); }