Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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
            });
        }
Ejemplo n.º 4
0
        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
            });
        }
Ejemplo n.º 5
0
        public byte[] Serialize(JobInfo jobInfo, IJobTypeProvider typeProvider)
        {
            var serializedEnvelope = ToSerializedEnvelope(jobInfo, typeProvider);

            return(SerializeEnvelope(jobInfo.ArgsType, serializedEnvelope));
        }