public DefaultJobPublisher(MassiveJobsSettings settings, IMessagePublisher messagePublisher, IJobTypeProvider jobTypeProvider, IJobSerializer jobSerializer, IJobLogger <DefaultJobPublisher> logger) { _batchSize = settings.PublishBatchSize; Settings = settings; MessagePublisher = messagePublisher; JobTypeProvider = jobTypeProvider; JobSerializer = jobSerializer; Logger = logger; // This is just to avoid always publishing to a first worker // since the new instance of publisher is created on each job batch // for scheduled/periodic workers. Actually, immediate workers will // also create one instance of publisher per batch to inject into // jobs if jobs require it in their constructors. var tickCount = Math.Abs(Environment.TickCount); if (settings.ImmediateWorkersCount > 0) { _nextImmediateWorkerIndex = tickCount % settings.ImmediateWorkersCount; } if (settings.ScheduledWorkersCount > 0) { _nextScheduledWorkerIndex = tickCount % settings.ScheduledWorkersCount; } if (settings.LongRunningWorkersCount > 0) { _nextLongRunningWorkerIndex = tickCount % settings.LongRunningWorkersCount; } }
public JobInfo Deserialize(ReadOnlySpan <byte> data, string argsTag, IJobTypeProvider typeProvider) { var argsType = typeProvider.TagToType(argsTag); Tuple <Type, ToJobInfoDelegate> info; lock (SerializationInfo) { if (!SerializationInfo.TryGetValue(argsType, out info)) { var serializedType = typeof(SerializedEnvelope <>).MakeGenericType(argsType); // ReSharper disable once PossibleNullReferenceException var methodInfo = typeof(BaseSerializer).GetMethod(nameof(GetToJobInfoDelegate), BindingFlags.Static | BindingFlags.NonPublic) .MakeGenericMethod(argsType); var jobDelegate = (ToJobInfoDelegate)methodInfo.Invoke(null, new object[] { argsType }); info = new Tuple <Type, ToJobInfoDelegate>(serializedType, jobDelegate); SerializationInfo.Add(argsType, info); } } var serializedEnv = DeserializeEnvelope(data, info.Item1); return(info.Item2(serializedEnv, argsTag, typeProvider)); }
private static JobInfo ToJobInfo <T>(SerializedEnvelope <T> serialized, string argsTag, IJobTypeProvider typeProvider) { var argsType = typeProvider.TagToType(argsTag); var jobType = typeProvider.TagToType(serialized.J); return(new JobInfo { JobType = jobType, ArgsType = argsType, Args = serialized.A, Err = serialized.E, RunAtUtc = serialized.At, Retries = serialized.R, TimeoutMs = serialized.T, GroupKey = serialized.G, PeriodicRunInfo = serialized.P }); }
private static SerializedEnvelope <object> ToSerializedEnvelope(JobInfo jobInfo, IJobTypeProvider typeProvider) { var jobTag = typeProvider.TypeToTag(jobInfo.JobType); return(new SerializedEnvelope <object> { J = jobTag, A = jobInfo.Args, E = jobInfo.Err, At = jobInfo.RunAtUtc, R = jobInfo.Retries, T = jobInfo.TimeoutMs, G = jobInfo.GroupKey, P = jobInfo.PeriodicRunInfo }); }
public byte[] Serialize(JobInfo jobInfo, IJobTypeProvider typeProvider) { var serializedEnvelope = ToSerializedEnvelope(jobInfo, typeProvider); return(SerializeEnvelope(jobInfo.ArgsType, serializedEnvelope)); }