• Separate short description and description of a job and show short description in listings and description on the details page in the admin UI


  • Fix issue with Nexus functions with arguments not getting called correctly


  • Adds description text for jobs in the admin UI which can be edited in the UI, markdown supported
  • Adds cancellation token support for Nexus functions
  • Fixes admin UI to not say "Starts in in X seconds" with a duplicate "in"
  • Fixes admin UI job start dates to not show dates in past time


  • Fix incorrect use of service scope


  • Use service provider scope in all places where a scheduled job instance is used


  • Changes jobs and functions to use a service provider scope when creating service instances in order to support services registered with a scoped lifetime.


  • Fix issue with using enums as arguments to Nexus functions


  • Correctly report outcome on Open Telemetry activities/traces



  • Fix how casts of Nexus function arguments are handled


  • Adds more filtering and sorting to job runs in admin UI
  • Fixes bug with serializing GUIDs with System.Text.Json


  • Adds filtering of job runs in admin UI
  • Adds missing database index for job runs


  • Support List.Contains() in IQueueItemUpdater.UpdateStatusWhereAsync()
  • The health checks system now has a watch dog that will reset any check that is stuck in a running state. Eg if the process crashed after the check finished but before Nexus was able to update the status.
  • Fix issue where enabling queue history for all queues included queues where messages don't have id
  • Ensure that the ILoggerProvider for job logs aren't registered multiple times


  • Improve error handling with instance events


  • Add transient database error retries on all methods on IQueueReader
  • No longer assumes that a temp table still exists since it might get deleted when a connection is reopened


  • Fix issue with Postgres and SQL Server that caused an error if you called IEnqueuer<TMessage>.EnqueueAsync() with an empty list of messages
  • Reset migrations if they're stuck in a running state because of a server crash


  • Explicitly drop temp tables instead of relying on connection close to delete them


  • Make it possible to change priority on a message when scheduling a future processing
  • Improve handling of merging partial messages in SQL Server
  • Add retries on transient database errors in more situations


  • Fix issue with queue messages that has propertiy types without parameterless constructors


  • Fix issue using MaxRetries in [NexusFunction] attributes
  • Fix issue causing JSON serialization errors in the Slack healty reporter
  • Support enqueueing partial messages, read more here
  • Add retries on SQL queries with SQLite that caused "database is locked" errors
  • Run retries on transient database errors more granularly and in more places


This release contains a few breaking changes that are described in the upgrade guide. The breaking changes are mostly a code and project reorganization that should be easy to upgrade to.

Besides the reorganization some notable changes are:

  • The scheduled jobs system now has a watch dog that will reset any job that is stuck in a running state. Eg if the process crashed after the job finished but before Nexus was able to update the job status.
  • All NuGet dependencies have been updated to the latest version as well as .NET.
  • Serilog is no longer a dependency to Nexus.
  • Newtonsoft.Json is no longer a direct dependency to Nexus, the support for Newtonsoft.Json has been extracted to a separate package.
  • It's now possible to register middlewares around job execution.
  • It's now possible to set job and log history per job.


  • Allows queue jobs to set custom statuses for messages. Read more here.



  • Adds feature detection for if queue history is enabled to avoid SQL queries running against tables that doesn't exist


  • Adds opt-in message history for queues with identity. Read more here.


  • Adds retries to the database maintenance job when using Postgres.


  • Fixes risks for deadlocks when job progress hasn't finished writing before the job is done. When a job finishes and cleanup attempts to delete job progress before the job progress has finished writing a deadlock could occur because the update and cleanup/delete tries to write the same row.


  • Removes a query hint when using SQL Server that required READ COMMITTED isolation level. The recommended isolation level is READ COMMITTED SNAPSHOT, but is not a hard requirement.


  • Makes it possible to initiate a soft graceful shutdown which means that all jobs, functions, etc that has already started will run until finished but no new work will be started. See more here.


  • Fixes regression around running internal Nexus migrations.


  • Makes it possible to pass a transaction to DbConnectionScope.


  • Makes it possible to stop queue processing when an error occur, and pause it until no messages in the queue has an Error or AwaitingRetry status any more. See more here.


  • Adds IDbConnectionScope which lets you pass an existing db connection object to Nexus. See more here.


  • Fixes an issue where extra job runs (such as a retry) disappeared if they needed to aquire a mutex and that mutex was already taken


  • IQueueItemUpdater.DeleteAndReturnAllAsync() added as a safe way to read and delete all messages in a queue in a single and safe operation
  • IScheduledJobMetaDataRepository.GetJobMetaDataAsync<TJob>() added


  • Let outcome descriptions line break in admin UI


  • Expire the jobs meta data cache after five seconds to prevent stale cache issues


  • Add debug logging to queue processing jobs


  • Use long for queue message ids everywhere
  • Ensure that changing a job schedule doesn't immediately trigger a new run if the schedule is moved forward in time


  • Fix issue causing MaxNumberOfMessagesPerRun not to work on queue jobs


  • Make it possible to control how many messages a single queue job run is allowed to process
  • Show the Nexus version in the admin UI
  • Don't show a Disable button for a health check for a disabled job


  • Fix issuing causing some health checks to not show up in admin UI


  • Fix issuing making it impossible to resolve a failed job run


  • Fix links to job details in health check details
  • Add caching for health check statistics to avoid polling the database on the health overview
  • Health periods are now not filled out to include the space in time between two periods


  • Change job health check to not generate a unique result description every time it's called


  • Stores health check results so it's possible to see the history of a health check in the Admin UI


  • Fix issue which caused migrations to be run out-of-order


  • Make it possible to use Nexus job logs in the admin UI without Serilog.

Previously you needed to use Serilog in order for your job logs to get the correct context/scope values attached to know which job they originated from. Nexus now uses standard .NET logging for this which means that you no longer need to use Serilog for it. See more in the documentation under Jobs / Logs.


  • Reset healthchecks when an instance is starting. If an instance crashed or was deployed in the middle of when a healthcheck was running it can still be reported as running after the deploy or restart finishes. This fixes that all healthchecks are reset that claims to be running on the instance that is just starting up.


  • Added JobResults.CompletedWithWarnings() which lets a job return a successful status but have the run flagged with a warning sign in the Admin UI and the job health check status become Degraded


  • Messages that are Leased will now be transitioned into a new status called Abandoned if the lease expires due to a server crash. See docs about abandoned messages.
  • Messages that are scheduled for a retry now has a new status called AwaitingRetry instead of being in the Error status.
  • A new max retry limit has been introduced which defaults to 10. If the same message has been retried more times than that the message is transitioned to the Error status and won't be automatically retried again.
  • Instance id and correlation id is now set on queue messages when they are leased to be able to find logs for the job that processed a message.


  • Minor styling issue fixed in Functions list in Admin UI


  • Make it possible to group queues in the Admin UI by category just like what's possible for jobs


  • Fix issue where the admin UI could display "0" instead of "No logs found"
  • Make it possible to have a new job be initially disabled


  • Fix issue which could cause an infinite loop in ScheduledJobExecutorService when using multiple servers and jobs that executes frequently
  • Lowered log level from information to debug on some logs that occur frequently


  • Includes debug symbols in new snupkg packages, published to the Github NuGet feed


  • Removed unnecessary database calls that were made to release job mutexes, even for jobs without any mutexes
  • Nexus will now react slightly quicker to the cancellation token that signals that the app is shutting down
  • A new way of dealing with exceptions in background services ensures that Nexus is more resilient against intermittent database failures


  • Made it possible to customize the example message shown in the admin UI when enqueueing a new message manually.
  • IScheduledBatchQueueJob.GetBatchSize() has been deprecated in favor of IScheduledBatchQueueJob.BatchSize. The GetBatchSize() method will be removed in the next major version.


  • Add missing indexes to mutex table to avoid deadlocks when attempting to release job mutexes


  • Apply less locking when fetching job data from SQL Server to avoid deadlocks


  • Fix issue in API usage of Nexus Functions with SQL Server


  • Fix concurrency issue with leasing queue messages and marking functions as running when using Postgres.


  • Fix issue where instance heartbeat healthchecks reported the time in 12 hour
  • Fix text overflow in health check admin UI for long descriptions


  • Dispose CancellationTokenSource in ScheduledJobExecutorService after use


  • Add horizontal scrollbar for long queue processing log in admin UI


  • Remove testing code in the admin UI that slipped through in 1.6.0


  • Make it possible for jobs to report their progress and display it in the admin UI
  • Use Tailwind instead of CSS Modules in admin UI


  • Use higher query timeout for all queries in IDatabaseMaintenanceService
  • Show resolved/dismissed state for latest run in job list


  • Fix issue with database polling instance events


  • Fix issue with admin UI not rendering correctly when not having a trailing slash in the url (ie just /admin and not /admin/)


  • Fix issue with duration incorrectly being stored as decimal in SQLite when integer is expected


  • Make it possible to mark a failed job run as resolved or dismissed with an optional markdown comment
  • Make it possible to add a comment to queue messages
  • Store both latest job run and latest meaningful job run to since some jobs run very frequently but doesn't perform work all the time
  • Fix when cancelling a queue job the historical run status becomes should be Cancelled rather than Completed


  • Add RetryLater as a successful job outcome


  • Fix issue with database maintenance on SQL Express


  • Reset any health checks marked as running when an instance is starting


  • Ask for a connection string every time the database is opened to make it possible to use connection strings with updated credentials


  • Add query timeout of 5 minutes for database maintenance queries
  • Make it possible to update queue message status by filtering on message JSON properties
  • Increase timeout when deleting old job runs and logs


  • Show a health check for a disabled job as disabled
  • Implement graceful shutdown which attempts to stop Nexus background processes before the .NET application begins to terminate to ensure that all jobs etc aren't running when the application terminates
  • Generate a unique Nexus instance id for Azure App Service where a single VM can run multiple applications


  • Increase query timeout for updating queue messages to correct status
  • Make it possible to update all queue items to a certain status
  • Make it possible to mark a queue item as processed and schedule another processing of the message in the future
  • Only show main menu items in the admin UI if they have been configured
  • Add WITH (HOLDLOCK) to all SQL Server MERGE statements to avoid insert conflicts


Initial stable release.