예제 #1
0
        public async Task Start(JobDefinition <DefinitionExternalProcess> jobDefinition, FactoryStartOptions options)
        {
            if (status != null)
            {
                throw new JobFacInvalidRunStatusException($"Job has already been started (instance {jobInstanceKey})");
            }

            jobDefinition.ThrowIfInvalid();

            if (options.SequenceInstanceId.HasContent())
            {
                parentSequence = GrainFactory.GetGrain <IJobSequence>(options.SequenceInstanceId);
                if (parentSequence == null)
                {
                    throw new JobFacInvalidDataException($"Job {jobInstanceKey} failed to obtain parent Sequence {options.SequenceInstanceId}");
                }
            }

            this.jobDefinition = jobDefinition;

            status = new JobStatus <StatusExternalProcess>
            {
                Key          = jobInstanceKey,
                StartOptions = options,
                LastUpdated  = DateTimeOffset.UtcNow,
            };
            status.JobTypeProperties.MachineName = Dns.GetHostName().HasContent() ? Dns.GetHostName() : Environment.MachineName;
            await historyRepo.InsertStatus(status);

            await LaunchRunner();

            // TODO add startup timeout to check whether RunStatus changes from Unknown (requires grain timer support)
        }
예제 #2
0
        public static string ReportDifference(
            this IJobSequence first, IJobSequence second, StringBuilder builder)
        {
            if (builder == null)
            {
                builder = new StringBuilder();
            }

            var array1 = first.ToArray();
            var array2 = second.ToArray();

            if (!array1.Any() || !array2.Any())
            {
                builder.AppendLine($"firstCount={array1.Length}, secondCount={array2.Length}");
                return(builder.ToString());
            }

            if (array1.First().MachineId != array2.First().MachineId)
            {
                throw new Exception();
            }

            if (array1.SequenceEqual(array2))
            {
                builder.AppendLine($"Sequences equal M={array1.First().MachineId}");
                return(builder.ToString());
            }

            Console.Write($"Sequences different M={array1.First().MachineId}  ");
            int minLength = Math.Min(array1.Length, array2.Length);

            for (int i = 0; i < minLength; i++)
            {
                if (!array1[i].Equals(array2[i]))
                {
                    builder.Append($"{{ i={i}: {array1[i]} vs {array2[i]} }}  ");
                }
            }

            int maxLength = Math.Max(array1.Length, array2.Length);

            for (int i = minLength; i < maxLength; i++)
            {
                if (array1.Length > array2.Length)
                {
                    builder.Append($"{{ i={i}: {array1[i]} vs nothing }}  ");
                }
                else
                {
                    builder.Append($"{{ i={i}: nothing vs {array2[i]} }}  ");
                }
            }

            builder.AppendLine();
            return(builder.ToString());
        }