TickerQ 2.2.1-preview

This is a prerelease version of TickerQ.
There is a newer version of this package available.
See the version list below for details.
dotnet add package TickerQ --version 2.2.1-preview
                    
NuGet\Install-Package TickerQ -Version 2.2.1-preview
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="TickerQ" Version="2.2.1-preview" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="TickerQ" Version="2.2.1-preview" />
                    
Directory.Packages.props
<PackageReference Include="TickerQ" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add TickerQ --version 2.2.1-preview
                    
#r "nuget: TickerQ, 2.2.1-preview"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=TickerQ&version=2.2.1-preview&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=TickerQ&version=2.2.1-preview&prerelease
                    
Install as a Cake Tool

TickerQ

NuGet NuGet Build NuGet Packages Documentation

Robust. Adaptive. Precise.
TickerQ is a fast, reflection-free background task scheduler for .NET โ€” built with source generators, EF Core integration, cron + time-based execution, and a real-time dashboard.

๐Ÿ“š Full Docs: https://tickerq.arcenox.com

Note: As of v2.2.0, all TickerQ packages are versioned together โ€” even if a package has no changes โ€” to keep the ecosystem in sync. Always update all packages to the same version.


โœจ Features

  • Time and Cron Scheduling
  • Stateless Core with source generator
  • EF Core Persistence
  • Live Dashboard UI
  • Retry Policies & Throttling
  • Dependency Injection support
  • Multi-node distributed coordination

๐Ÿ“ฆ Installation

Core (required)

dotnet add package TickerQ

Entity Framework Integration (optional)

dotnet add package TickerQ.EntityFrameworkCore

Dashboard UI (optional)

dotnet add package TickerQ.Dashboard

โš™๏ธ Basic Setup

In Program.cs or Startup.cs

builder.Services.AddTickerQ(options =>
{
    options.SetMaxConcurrency(4); // Optional
    options.SetExceptionHandler<MyExceptionHandler>(); // Optional
    options.AddOperationalStore<MyDbContext>(efOpt => 
    {
        efOpt.UseModelCustomizerForMigrations(); // Applies custom model customization only during EF Core migrations
        efOpt.CancelMissedTickersOnApplicationRestart(); // Useful in distributed mode
    }); // Enables EF-backed storage
    options.AddDashboard(basePath: "/tickerq-dashboard"); // Dashboard path
    options.AddDashboardBasicAuth(); // Enables simple auth
});

app.UseTickerQ(); // Activates job processor

โ—๏ธIf Not Using UseModelCustomizerForMigrations()

You must apply TickerQ configurations manually in your DbContext:

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options)
        : base(options) { }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        // Apply TickerQ entity configurations explicitly
        builder.ApplyConfiguration(new TimeTickerConfigurations());
        builder.ApplyConfiguration(new CronTickerConfigurations());
        builder.ApplyConfiguration(new CronTickerOccurrenceConfigurations());

        // Alternatively, apply all configurations from assembly:
        // builder.ApplyConfigurationsFromAssembly(typeof(TimeTickerConfigurations).Assembly);
    }
}

๐Ÿ’ก Recommendation:
Use UseModelCustomizerForMigrations() to cleanly separate infrastructure concerns from your core domain model, especially during design-time operations like migrations.
Note: If you're using third-party libraries (e.g., OpenIddict) that also override IModelCustomizer, you must either merge customizations or fall back to manual configuration inside OnModelCreating() to avoid conflicts.

Job Definition

1. Cron Job (Recurring)

public class CleanupJobs
{
    [TickerFunction(FunctionName = "CleanupLogs", CronExpression = "0 0 * * *")]
    public void CleanupLogs()
    {
        // Runs every midnight
    }
}

This uses a cron expression to run daily at midnight.


2. One-Time Job (TimeTicker)

public class NotificationJobs
{
    [TickerFunction(FunctionName = "SendWelcome")]
    public Task SendWelcome(TickerFunctionContext<string> tickerContext ,CancellationToken ct)
    {
        Console.WriteLine(tickerContext.Request); // Output: User123
        return Task.CompletedTask;
    }
}

Then schedule it:

await _timeTickerManager.AddAsync(new TimeTicker
{
    Function = "SendWelcome",
    ExecutionTime = DateTime.UtcNow.AddMinutes(1),
    Request = TickerHelper.CreateTickerRequest<string>("User123"),
    Retries = 3,
    RetryIntervals = new[] { 30, 60, 120 } // Retry after 30s, 60s, then 2min
});

3. Injecting Services in Jobs (Fully DI Support)

public class ReportJobs
{
    private readonly IReportService _reportService;

    public ReportJobs(IReportService reportService)
    {
        _reportService = reportService;
    }

    [TickerFunction(FunctionName = "GenerateDailyReport", CronExpression = "0 6 * * *")]
    public async Task GenerateDailyReport()
    {
        await _reportService.GenerateAsync();
    }
}

Dashboard UI

Check out Dashboard Overview: TickerQ-Dashboard-Examples

Enabled by adding:

options.AddDashboard(basePath: "/tickerq-dashboard");
options.AddDashboardBasicAuth(); // Optional

Accessible at /tickerq-dashboard, it shows:

  • System status
  • Active tickers
  • Job queue state
  • Cron ticker stats
  • Execution history
  • Trigger/cancel/edit jobs live

Auth config (optional):

"TickerQBasicAuth": {
  "Username": "admin",
  "Password": "admin"
}

๐Ÿ” Retry & Locking

TickerQ supports:

  • Retries per job
  • Retry intervals (RetryIntervals)
  • Distributed locking (EF mode only)
  • Job ownership tracking across instances
  • Cooldown on job failure

๐Ÿงช Advanced: Manual CronTicker Scheduling

await _cronTickerManager.AddAsync(new CronTicker
{
    Function = "CleanupLogs",
    CronExpression = "0 */6 * * *", // Every 6 hours
    Retries = 2,
    RetryIntervals = new[] { 60, 300 }
});

๐Ÿ› ๏ธ Developer Tips

  • Use [TickerFunction] to register jobs
  • Use FunctionName consistently across schedule and handler
  • Use CancellationToken for graceful cancellation
  • Use Request to pass dynamic data to jobs

๐Ÿค Contribution

PRs, ideas, and issues are welcome!

  1. Fork & branch
  2. Code your change
  3. Submit a Pull Request

๐Ÿ“„ License

MIT OR Apache 2.0 ยฉ Arcenox
You may choose either license to use this software.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.3.0 0 7/7/2025
2.2.2 270 6/28/2025
2.2.2-preview 118 6/26/2025
2.2.1 263 6/24/2025
2.2.1-preview-1 126 6/24/2025
2.2.1-preview 126 6/24/2025
2.2.0 710 6/16/2025
2.2.0-preview 133 6/17/2025
2.1.7-preview 148 6/16/2025
2.1.6-preview 136 6/16/2025
2.1.5 132 6/16/2025
2.1.3 133 6/14/2025
2.1.1 267 6/7/2025
2.1.0 167 5/23/2025
2.0.1 410 4/25/2025
2.0.0 174 4/19/2025