示例#1
0
        public MqImageResultListener(JobForMq jobForMq, string inputQueuePath, BlockingCollection <SubJob> sendQueue, TimeSpan waitDuration)
        {
            _jobForMq       = jobForMq;
            _inputQueuePath = inputQueuePath;
            _sendQueue      = sendQueue;
            _waitDuration   = waitDuration;

            _cts  = new CancellationTokenSource();
            _task = null;
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        public IJob CreateJob(SMapWorkRequest sMapWorkRequest)
        {
            IJob result;

            if (sMapWorkRequest.RequiresQuadPrecision())
            {
                result = new JobForMq(sMapWorkRequest);
            }
            else
            {
                result = new Job(sMapWorkRequest);
            }

            return(result);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }