public void GetStateData_ReturnsCorrectData() { var state = new SucceededState(); DictionaryAssert.ContainsFollowingItems( new Dictionary<string, string> { { "SucceededAt", "<UtcNow timestamp>" }, }, state.Serialize()); }
private void ProcessJob( string jobId, IStorageConnection connection, IJobPerformanceProcess process, CancellationToken shutdownToken) { var stateMachine = _context.StateMachineFactory.Create(connection); var processingState = new ProcessingState(_context.ServerId, _context.WorkerNumber); if (!stateMachine.TryToChangeState( jobId, processingState, new[] { EnqueuedState.StateName, ProcessingState.StateName })) { return; } // Checkpoint #3. Job is in the Processing state. However, there are // no guarantees that it was performed. We need to re-queue it even // it was performed to guarantee that it was performed AT LEAST once. // It will be re-queued after the JobTimeout was expired. IState state; try { var jobData = connection.GetJobData(jobId); jobData.EnsureLoaded(); var cancellationToken = new ServerJobCancellationToken( jobId, connection, _context, shutdownToken); var performContext = new PerformContext( _context, connection, jobId, jobData.Job, jobData.CreatedAt, cancellationToken); var latency = (DateTime.UtcNow - jobData.CreatedAt).TotalMilliseconds; var duration = Stopwatch.StartNew(); process.Run(performContext, jobData.Job); duration.Stop(); state = new SucceededState((long) latency, duration.ElapsedMilliseconds); } catch (OperationCanceledException) { throw; } catch (JobPerformanceException ex) { state = new FailedState(ex.InnerException) { Reason = ex.Message }; } catch (Exception ex) { state = new FailedState(ex) { Reason = "Internal HangFire Server exception occurred. Please, report it to HangFire developers." }; } // Ignore return value, because we should not do // anything when current state is not Processing. stateMachine.TryToChangeState(jobId, state, new[] { ProcessingState.StateName }); }
private void PerformJob(IStorageConnection connection, JobPayload payload) { if (payload == null) { return; } var stateMachine = new StateMachine(connection); var processingState = new ProcessingState(_context.ServerName); if (!stateMachine.TryToChangeState( payload.Id, processingState, new [] { EnqueuedState.StateName, ProcessingState.StateName })) { return; } // Checkpoint #3. Job is in the Processing state. However, there are // no guarantees that it was performed. We need to re-queue it even // it was performed to guarantee that it was performed AT LEAST once. // It will be re-queued after the JobTimeout was expired. State state; try { IJobPerformStrategy performStrategy; var methodData = MethodData.Deserialize(payload.InvocationData); if (methodData.OldFormat) { // For compatibility with the Old Client API. // TODO: remove it in version 1.0 var arguments = JobHelper.FromJson<Dictionary<string, string>>( payload.Args); performStrategy = new JobAsClassPerformStrategy( methodData, arguments); } else { var arguments = JobHelper.FromJson<string[]>(payload.Arguments); performStrategy = new JobAsMethodPerformStrategy( methodData, arguments); } var performContext = new PerformContext(_context, connection, payload.Id, methodData); _context.PerformancePipeline.Run(performContext, performStrategy); state = new SucceededState(); } catch (JobPerformanceException ex) { state = new FailedState(ex.InnerException) { Reason = ex.Message }; } catch (Exception ex) { state = new FailedState(ex) { Reason = "Internal HangFire Server exception occurred. Please, report it to HangFire developers." }; } // TODO: check return value stateMachine.TryToChangeState(payload.Id, state, new [] { ProcessingState.StateName }); }
public void StateName_IsCorrect() { var state = new SucceededState(); Assert.Equal(SucceededState.StateName, state.Name); }
public void ShouldExpireJobOnApply() { var state = new SucceededState(); Assert.True(state.ExpireJobOnApply); }