Skip to content

Releases: Arcenox-co/TickerQ

v10.3.0

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 13 Apr 22:21
9da5341

What's New in v10.3.0

Source Generator Overhaul

  • Replaced StringBuilder code generation with const string templates — cleaner, more maintainable
  • Extracted analyzers into dedicated classes: MethodAnalyzer, ConstructorAnalyzer, InterfaceMethodAnalyzer
  • Generated TickerFunctionRef / TickerFunctionRef<T> structs for type-safe function references
  • Uses global:: prefix for all generated type references (namespace-safe)
  • Handles C# keyword aliases (stringSystem.String, intSystem.Int32, byte[]System.Byte[])

New MapTicker API

  • MapTicker<T>() — interface-based function registration with DI (no reflection, AOT-safe)
  • MapTicker("name", lambda) — lambda-based function registration
  • MapTickerGroup() — group functions with shared config (max concurrency, lifetime)
    • Inline callback style: services.MapTickerGroup("Orders", group => { ... })
    • Variable style: var group = services.MapTickerGroup("Orders"); group.MapTicker<ProcessOrder>();
  • Group prefixes function names: "GroupName.ClassName"

ITickerQueryable Abstraction

  • New ITickerQueryable<T> interface — provider-agnostic fluent query builder
  • Supports: Where(), OrderBy(), OrderByDescending(), Skip(), Take(), AsNoTracking(), WithRelated()
  • Terminal methods: ToArrayAsync(), FirstOrDefaultAsync(), CountAsync(), ToPaginatedAsync()
  • EF Core implementation (EfTickerQueryable) — translates to LINQ-to-SQL
  • In-memory implementation (InMemoryTickerQueryable) — for Redis and other providers
  • New persistence provider methods: TimeTickersQuery(), CronTickersQuery(), CronTickerOccurrencesQuery()

Dashboard AOT Compatibility

  • Rewrote all endpoint handlers to accept only HttpContext (NativeAOT compatible)
  • Replaced Results.Json with WriteJson helper using JsonTypeInfo
  • Rewrote JsonExampleGenerator to use JsonTypeInfo.Properties (zero reflection)
  • Fixed StringToByteArrayConverter to use JsonTypeInfo overloads
  • Removed DefaultJsonTypeInfoResolver from DashboardJsonOptions
  • Added IsAotCompatible to Dashboard csproj
  • Zero AOT warnings from Dashboard code

AOT-Safe Request Serialization

  • WithJsonContext() API for user-provided AOT JsonSerializerContext
  • SignalR and exception serialization are now AOT-safe

Redis Provider Refactor

  • Extracted BaseRedisPersistenceProvider with core scheduler logic (mirrors EF Core pattern)
  • Extracted helpers: RedisKeyBuilder, RedisIndexManager, RedisSerializer
  • Moved Lua scripts to embedded .lua files (Acquire, Release, RecoverDeadNode)
  • AOT: source-gen JsonSerializerContext, JsonTypeInfo overloads throughout
  • Added TickerQRedisOptionBuilder.JsonSerializerContext for user-provided AOT contexts
  • Added predicate filtering inside deserialization loop (reduced memory allocation)

Bug Fixes

  • Fix startup cron occurrence duplicate scheduling (#776) — stale past-due occurrences from a previous app lifecycle are now optionally skipped on startup via SkipStaleCronOccurrencesOnStartup() (opt-in, configurable threshold)
  • Fix TickerFunctionProvider.Build() with concurrent test hosts (#784) — added locking to function and request type registrations to prevent lost registrations during concurrent host startup
  • Fix Dashboard host authentication (#786) — simplified to click-to-authenticate flow, removed direct access key input

Other

  • Added cron validator with normalizer
  • Updated logo from PNG to SVG
  • Comprehensive unit tests for Redis persistence (32 persistence + 14 manager integration + 5 on-demand)

Contributors

Thanks to all contributors for this release! 🎉

Full Changelog: v10.2.5...v10.3.0

v10.2.5

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 22 Mar 13:17
3e2fb29

What's Changed

  • Fix PostgreSQL incompatible boolean default in CronTicker by @arcenox in #779
  • Adjust WebAPI sample with dashboard integration. by @RafaelJCamara in #777

Full Changelog: v10.2.4...v10.2.5

v10.2.4

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 21 Mar 19:15

What's New in 10.2.4

Bug Fixes

  • Fix dashboard InvalidOperationException with Host authentication (#408) — Adds UseAuthorization() to the dashboard's Map() branch pipeline when auth is enabled, fixing the error Endpoint contains authorization metadata, but a middleware was not found that supports authorization when using WithHostAuthentication()

Improvements

  • Switch Sample.WorkerService to ProjectReference — Fixes sync build failures on net8/net9 branches where $(Version) resolved to a NuGet version that doesn't exist yet. All sample projects now consistently use ProjectReference
  • Fix build pipeline restore — Restore only build targets instead of full solution to avoid sample project dependency issues in CI

No Breaking Changes

All changes are fully backwards-compatible. No API changes required.

v10.2.3

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 21 Mar 18:18

What's New in 10.2.3

Bug Fixes

  • Fix TickerFunctionProvider.Build() race condition (#705) — Build() is now thread-safe with a lock, preventing concurrent hosts (e.g. multiple WebApplicationFactory instances in integration tests) from overwriting a populated FrozenDictionary with an empty one
  • Fix NullReferenceException on dashboard API — Static FrozenDictionary fields are now initialized to .Empty instead of null, preventing crashes when UseTickerQ() is not called

Improvements

  • Deferred initialization to hosted service (#712) — UseTickerQ() no longer performs I/O (DB seeding, function discovery). All initialization is deferred to TickerQInitializerHostedService.StartAsync(), which means design-time tools (dotnet-ef, dotnet-getdocument, OpenAPI generators) no longer crash when building the host
  • Proper async seeding — DB seeding is now properly awaited instead of using .GetAwaiter().GetResult(), eliminating potential deadlocks
  • Startup validation warnings — New TickerQStartupValidator hosted service warns at startup when:
    • UseTickerQ() was not called
    • No [TickerFunction] methods are found in the application
  • Source Link & symbol packages — NuGet packages now include .snupkg symbol packages and Source Link metadata for improved debugging

Dashboard

  • Fix timezone parsing for dashboard date/time display (#757)

No Breaking Changes

All changes are fully backwards-compatible. No API changes required.

TickerQ v10.2.0 / v9.2.0 / v8.2.0

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 15 Mar 21:43

What's New

Features

  • Per-function concurrency control — New maxConcurrency parameter on ticker attributes to limit concurrent executions per function (#670)
  • IsEnabled property for CronTickerEntity — Enable/disable individual cron tickers with full-stack support (API, Dashboard, EF Core) (#632)
  • JSON-serializable tracking fields — Added serializable tracking fields to TimeTickerEntity for better observability (#609) — thanks @stevewoj
  • Dashboard OpenAPI group name — Custom group name support for Dashboard OpenAPI endpoints (#585)

Bug Fixes

  • Dashboard date formatting — Fixed timezone-region-aware date formatting and cron ticker toggle bug (#683)
  • Dashboard date format — Use locale-independent YYYY-MM-DD format (#666, #663)
  • Redis overriding EF Core — Fixed AddStackExchangeRedis overriding the EF Core persistence provider (#676)
  • Empty request deserialization — Fixed JsonException on empty request body (#658)
  • Source generator namespace sanitization — Fixed namespace generation for assemblies with invalid C# identifier characters (#657)
  • Design-time DbContext — Fixed failure when TickerQEfCoreOptionBuilder is unavailable at design time (#652)
  • Dashboard BasePath — Fixed BasePath not working with UsePathBase (#651)
  • CSP compliance — Eliminated inline scripts from Dashboard for script-src 'self' Content Security Policy support (#648)
  • Legacy Startup.cs pattern — Fixed Dashboard failing when IHost doesn't implement IApplicationBuilder (#641)
  • Reflection-free Dashboard JSON — Replaced reflection-based JSON serialization in Dashboard with source generators (#638)
  • Schema customizer — Fixed TickerModelCustomizer not applying the configured schema (#635)
  • MySQL type mapping — Fixed EF Core type mapping error for MySQL providers in MigrateDefinedCronTickers (#631)
  • UseApplicationDbContext — Fixed UseApplicationDbContext implementation (#590) — thanks @Kedireng
  • Authorization policy — Fixed Authorize against HostAuthorizationPolicy when set (#591) — thanks @stevewoj
  • Fix issue #522 — Resolved reported issue (#587)
  • Unit testing fix — Fixed test infrastructure issue (#586)

Infrastructure & Testing

  • Centralized test project versions for cross-branch compatibility (#673)
  • Relaxed abstractions version constraints and fixed sync workflow version handling (#645, #647)
  • Improved branch sync workflow, migrated to .slnx, and cleaned up repo (#628)
  • Added comprehensive unit tests for core TickerQ components (#582, #623)
  • Fixed Redis registration test and removed redundant Hosting.Abstractions reference (#680)
  • Added worker service sample project
  • Added TickerQ Hub to README

NuGet Packages

Package v10.x v9.x v8.x
TickerQ 10.2.0 9.2.0 8.2.0
TickerQ.EntityFrameworkCore 10.2.0 9.2.0 8.2.0
TickerQ.Dashboard 10.2.0 9.2.0 8.2.0
TickerQ.StackExchangeRedis 10.2.0 9.2.0 8.2.0
TickerQ.OpenTelemetry 10.2.0 9.2.0 8.2.0
TickerQ.Utilities 10.2.0 9.2.0 8.2.0

Contributors

Thank you to everyone who contributed to this release! 🎉

  • @Kedireng (Ingmar Olmaru) — Fix UseApplicationDbContext implementation (#590)
  • @stevewoj (Steve) — JSON-serializable tracking fields (#609), Fix authorization policy (#591)

Full Changelog: 10.1.1...10.2.0

v10.1.1

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 11 Feb 11:05

What's Changed

  • fix update ExecutionTime for CronTickerOccurrence by @AlexeyKhlebnikov in #461
  • feat: add configurable policy name for Host auth by @jods4 in #482
  • fix: Host auth. should not depend on Authorization header by @jods4 in #481
  • [Feature] Remove ASP.NET Core dependency from TickerQ.Utilities to support all .NET platforms by @EarlJester in #480
  • Fix PR #481: missing await to AuthenticateHostAsync call by @jods4 in #494
  • Add missing Z suffix when formating execution time by @jods4 in #503
  • Fix stackoverflow in JsonExampleGenerator by @stevewoj in #519
  • Feature/tickerq hub by @arcenox in #508
  • Add missing ASP.NET Core package references to TickerQ.SDK by @arcenox in #537
  • Claude/fix aspnetcore namespace xuvot by @arcenox in #540
  • Remove invalid ASP.NET Core package references by @arcenox in #541
  • Claude/remove invalid aspnetcore packages xuvot by @arcenox in #542
  • Claude/remove invalid aspnetcore packages xuvot by @arcenox in #543
  • Enable NuGet package generation for Web SDK projects by @arcenox in #546
  • Fix #511 and #517: null reference and orphaned cron ticker bugs by @arcenox in #549
  • Fix thread-safety bugs, resource leaks, and scheduling issues by @desty2k in #550
  • Convert array parameters to lists in LINQ queries for EF Core by @arcenox in #574

New Contributors

Full Changelog: 10.0...10.1.1

TickerQ v10.0

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 11 Dec 12:18
d7716b9

What's Changed

  • Adding unit test by @aryanriyahi in #81
  • ci: add simple GH action to run when a PR is open. by @RafaelJCamara in #101
  • docs: update Discord link in README by @RafaelJCamara in #103
  • Implement Human Readable Cron Expression by @teesofttech in #96
  • Merge branch 'main' of https://github.com/Arcenox-co/TickerQ by @neozhu in #117
  • refactor: remove unused variables and using statements. by @RafaelJCamara in #116
  • Updated Readme docs by @teesofttech in #119
  • Fixed the properties to make it compatible with lazy load and also ch… by @arcenox in #120
  • #93 Dashboard displays incorrect executed at time after refresh (when… by @jova1971 in #124
  • chore: add dashboard sample with basic authentication by @RafaelJCamara in #126
  • feat(dashboard): add tooltip to Cron Ticker page by @RafaelJCamara in #127
  • feat(dashboard): add tooltips for time ticker view. by @RafaelJCamara in #134
  • feat(dashboard): route to dashboard when we click on logo or TickerQ name. by @RafaelJCamara in #132
  • Updated the invoke on condition if is declated only by @arcenox in #137
  • Fixed the creation of CronTicker from api by @arcenox in #148
  • Add ability to override default schema by @Arthur9205 in #144
  • Add Tarc94 to backers on Readme by @arcenox in #156
  • feat(dashboard): add pagination to declared functions and used machines by @RafaelJCamara in #165
  • Added example in readme to start TickerQ manually. by @ewilliams0305 in #164
  • docs: update readme with more developer tips by @RafaelJCamara in #162
  • V2.5.0-preview, Updated dashboard view and major fixes in Multinode and functionality by @arcenox in #179
  • Fixed the update cron ticker by @arcenox in #191
  • Fix authorization host authorization with roles by @vaital3000 in #197
  • Border Radius table style fix by @jacokok in #196
  • Minimal Readme file for github by @arcenox in #194
  • Added pragmas into source generators. by @zetroot in #212
  • UI assets basepath runtime by @arcenox in #213
  • open ticker clock interface by @arcenox in #214
  • fixed the missing generated id on models by @arcenox in #215
  • Target .NET 8 and .NET 9 by @0xced in #169
  • Beta version of net8.0 by @arcenox in #321
  • Enhance UseTickerSeeder by @mdemrulkayes in #325
  • Change the delete behavior of TimeTicker by @mdemrulkayes in #329
  • Extended Termination of a job with detailed and also with adjustable … by @arcenox in #349
  • updated source generator to netstandard2.0 by @arcenox in #352
  • Hotfix/serialization request fix by @arcenox in #350
  • Fixed the json options to be isolated by @arcenox in #375
  • Fix/schedulerbackground by @arcenox in #376
  • beta version 17 release by @arcenox in #382
  • Feature/improvements by @arcenox in #386
  • Feature/new improvements by @arcenox in #397
  • Fix schema assignment logic and add SetSchema method by @SpaceOgre in #415
  • Add support for enabling/disabling background services by @SpaceOgre in #413
  • Fix retry logic and add unit tests for ExecuteTaskAsync by @SpaceOgre in #429
  • fix: Namespace conflicts for ModuleInitializer attribute by @HulinCedric in #433

New Contributors

Full Changelog: v2.4.0...10.0

TickerQ v9.0

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 11 Dec 12:18
0a97d0a

What's Changed

  • Adding unit test by @aryanriyahi in #81
  • ci: add simple GH action to run when a PR is open. by @RafaelJCamara in #101
  • docs: update Discord link in README by @RafaelJCamara in #103
  • Implement Human Readable Cron Expression by @teesofttech in #96
  • Merge branch 'main' of https://github.com/Arcenox-co/TickerQ by @neozhu in #117
  • refactor: remove unused variables and using statements. by @RafaelJCamara in #116
  • Updated Readme docs by @teesofttech in #119
  • Fixed the properties to make it compatible with lazy load and also ch… by @arcenox in #120
  • #93 Dashboard displays incorrect executed at time after refresh (when… by @jova1971 in #124
  • chore: add dashboard sample with basic authentication by @RafaelJCamara in #126
  • feat(dashboard): add tooltip to Cron Ticker page by @RafaelJCamara in #127
  • feat(dashboard): add tooltips for time ticker view. by @RafaelJCamara in #134
  • feat(dashboard): route to dashboard when we click on logo or TickerQ name. by @RafaelJCamara in #132
  • Updated the invoke on condition if is declated only by @arcenox in #137
  • Fixed the creation of CronTicker from api by @arcenox in #148
  • Add ability to override default schema by @Arthur9205 in #144
  • Add Tarc94 to backers on Readme by @arcenox in #156
  • feat(dashboard): add pagination to declared functions and used machines by @RafaelJCamara in #165
  • Added example in readme to start TickerQ manually. by @ewilliams0305 in #164
  • docs: update readme with more developer tips by @RafaelJCamara in #162
  • V2.5.0-preview, Updated dashboard view and major fixes in Multinode and functionality by @arcenox in #179
  • Fixed the update cron ticker by @arcenox in #191
  • Fix authorization host authorization with roles by @vaital3000 in #197
  • Border Radius table style fix by @jacokok in #196
  • Minimal Readme file for github by @arcenox in #194
  • Added pragmas into source generators. by @zetroot in #212
  • UI assets basepath runtime by @arcenox in #213
  • open ticker clock interface by @arcenox in #214
  • fixed the missing generated id on models by @arcenox in #215
  • Target .NET 8 and .NET 9 by @0xced in #169
  • Beta version of net8.0 by @arcenox in #321
  • Enhance UseTickerSeeder by @mdemrulkayes in #325
  • Change the delete behavior of TimeTicker by @mdemrulkayes in #329
  • Extended Termination of a job with detailed and also with adjustable … by @arcenox in #349
  • updated source generator to netstandard2.0 by @arcenox in #352
  • Hotfix/serialization request fix by @arcenox in #350

New Contributors

Full Changelog: v2.4.0...9.0

TickerQ v8.0

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 11 Dec 12:17
317a112

What's Changed

  • Adding unit test by @aryanriyahi in #81
  • ci: add simple GH action to run when a PR is open. by @RafaelJCamara in #101
  • docs: update Discord link in README by @RafaelJCamara in #103
  • Implement Human Readable Cron Expression by @teesofttech in #96
  • Merge branch 'main' of https://github.com/Arcenox-co/TickerQ by @neozhu in #117
  • refactor: remove unused variables and using statements. by @RafaelJCamara in #116
  • Updated Readme docs by @teesofttech in #119
  • Fixed the properties to make it compatible with lazy load and also ch… by @arcenox in #120
  • #93 Dashboard displays incorrect executed at time after refresh (when… by @jova1971 in #124
  • chore: add dashboard sample with basic authentication by @RafaelJCamara in #126
  • feat(dashboard): add tooltip to Cron Ticker page by @RafaelJCamara in #127
  • feat(dashboard): add tooltips for time ticker view. by @RafaelJCamara in #134
  • feat(dashboard): route to dashboard when we click on logo or TickerQ name. by @RafaelJCamara in #132
  • Updated the invoke on condition if is declated only by @arcenox in #137
  • Fixed the creation of CronTicker from api by @arcenox in #148
  • Add ability to override default schema by @Arthur9205 in #144
  • Add Tarc94 to backers on Readme by @arcenox in #156
  • feat(dashboard): add pagination to declared functions and used machines by @RafaelJCamara in #165
  • Added example in readme to start TickerQ manually. by @ewilliams0305 in #164
  • docs: update readme with more developer tips by @RafaelJCamara in #162
  • V2.5.0-preview, Updated dashboard view and major fixes in Multinode and functionality by @arcenox in #179
  • Fixed the update cron ticker by @arcenox in #191
  • Fix authorization host authorization with roles by @vaital3000 in #197
  • Border Radius table style fix by @jacokok in #196
  • Minimal Readme file for github by @arcenox in #194
  • Added pragmas into source generators. by @zetroot in #212
  • UI assets basepath runtime by @arcenox in #213
  • open ticker clock interface by @arcenox in #214
  • fixed the missing generated id on models by @arcenox in #215
  • Target .NET 8 and .NET 9 by @0xced in #169
  • Beta version of net8.0 by @arcenox in #321
  • Enhance UseTickerSeeder by @mdemrulkayes in #325
  • Change the delete behavior of TimeTicker by @mdemrulkayes in #329
  • Extended Termination of a job with detailed and also with adjustable … by @arcenox in #349
  • updated source generator to netstandard2.0 by @arcenox in #352
  • Hotfix/serialization request fix by @arcenox in #350

New Contributors

Full Changelog: v2.4.0...8.0.0

TickerQ 2.4.0

Choose a tag to compare

@albert-kunushevci albert-kunushevci released this 14 Jul 09:35
41fc672

🚀 TickerQ v2.4.0

✅ What's New

  • Execution on Demand
    Introduced support for programmatically triggering cron ticker executions.

  • Console Application Support
    TickerQ now runs as a standalone console application, making it suitable for headless environments.
    Includes example usage and setup.


Fixes & Improvements

  • #78 – Added reference to Microsoft.Extensions.Hosting.Abstractions to ensure hosting compatibility.
    by @snargledorf

  • #77 – Added console runner support along with usage examples.
    by @arcenox

  • #76 – Add support for on-demand execution in cron ticker.
    by @snargledorf

  • #74 – Display a dedicated exception dialog when cron ticker execution fails.
    by @snargledorf

  • #73 – Explicitly call AddApplicationPart() with the TickerQController assembly for proper controller discovery in ASP.NET hosts.
    by @snargledorf


🛠 Internal / Misc

  • Improved modularity and structure in runners
  • Cleaned up hosting logic for better extensibility
  • Refactored examples to be clearer for first-time users

📌 Tag: v2.4.0
📅 Released: 2025-07-14