Skip to content

Commit 8eee86e

Browse files
authored
Merge branch 'dev' into Blazorise2.0
2 parents beccb8d + a1879f4 commit 8eee86e

35 files changed

Lines changed: 585 additions & 87 deletions

File tree

Directory.Packages.props

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,10 @@
183183
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.6.3" />
184184
<PackageVersion Include="TencentCloudSDK.Sms" Version="3.0.1273" />
185185
<PackageVersion Include="TimeZoneConverter" Version="7.2.0" />
186-
<PackageVersion Include="TickerQ" Version="2.5.3" />
187-
<PackageVersion Include="TickerQ.Dashboard" Version="2.5.3" />
188-
<PackageVersion Include="TickerQ.Utilities" Version="2.5.3" />
189-
<PackageVersion Include="TickerQ.EntityFrameworkCore" Version="2.5.3" />
186+
<PackageVersion Include="TickerQ" Version="10.1.1" />
187+
<PackageVersion Include="TickerQ.Dashboard" Version="10.1.1" />
188+
<PackageVersion Include="TickerQ.Utilities" Version="10.1.1" />
189+
<PackageVersion Include="TickerQ.EntityFrameworkCore" Version="10.1.1" />
190190
<PackageVersion Include="Unidecode.NET" Version="2.1.0" />
191191
<PackageVersion Include="xunit" Version="2.9.3" />
192192
<PackageVersion Include="xunit.extensibility.execution" Version="2.9.3" />
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# ABP.IO Platform 10.1 Final Has Been Released!
2+
3+
We are glad to announce that [ABP](https://abp.io/) 10.1 stable version has been released.
4+
5+
## What's New With Version 10.1?
6+
7+
All the new features were explained in detail in the [10.1 RC Announcement Post](https://abp.io/community/announcements/announcing-abp-10-1-release-candidate-cyqui19d), so there is no need to review them again. You can check it out for more details.
8+
9+
## Getting Started with 10.1
10+
11+
### How to Upgrade an Existing Solution
12+
13+
You can upgrade your existing solutions with either ABP Studio or ABP CLI. In the following sections, both approaches are explained:
14+
15+
### Upgrading via ABP Studio
16+
17+
If you are already using the ABP Studio, you can upgrade it to the latest version. ABP Studio periodically checks for updates in the background, and when a new version of ABP Studio is available, you will be notified through a modal. Then, you can update it by confirming the opened modal. See [the documentation](https://abp.io/docs/latest/studio/installation#upgrading) for more info.
18+
19+
After upgrading the ABP Studio, then you can open your solution in the application, and simply click the **Upgrade ABP Packages** action button to instantly upgrade your solution:
20+
21+
![](upgrade-abp-packages.png)
22+
23+
### Upgrading via ABP CLI
24+
25+
Alternatively, you can upgrade your existing solution via ABP CLI. First, you need to install the ABP CLI or upgrade it to the latest version.
26+
27+
If you haven't installed it yet, you can run the following command:
28+
29+
```bash
30+
dotnet tool install -g Volo.Abp.Studio.Cli
31+
```
32+
33+
Or to update the existing CLI, you can run the following command:
34+
35+
```bash
36+
dotnet tool update -g Volo.Abp.Studio.Cli
37+
```
38+
39+
After installing/updating the ABP CLI, you can use the [`update` command](https://abp.io/docs/latest/CLI#update) to update all the ABP related NuGet and NPM packages in your solution as follows:
40+
41+
```bash
42+
abp update
43+
```
44+
45+
You can run this command in the root folder of your solution to update all ABP related packages.
46+
47+
## Migration Guides
48+
49+
There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v10.0 or earlier versions: [ABP Version 10.1 Migration Guide](https://abp.io/docs/latest/release-info/migration-guides/abp-10-1)
50+
51+
## Community News
52+
53+
### New ABP Community Articles
54+
55+
As always, exciting articles have been contributed by the ABP community. I will highlight some of them here:
56+
57+
* [Enis Necipoğlu](https://abp.io/community/members/enisn):
58+
* [ABP Framework's Hidden Magic: Things That Just Work Without You Knowing](https://abp.io/community/articles/hidden-magic-things-that-just-work-without-you-knowing-vw6osmyt)
59+
* [Implementing Multiple Global Query Filters with Entity Framework Core](https://abp.io/community/articles/implementing-multiple-global-query-filters-with-entity-ugnsmf6i)
60+
* [Suhaib Mousa](https://abp.io/community/members/suhaib-mousa):
61+
* [.NET 11 Preview 1 Highlights: Faster Runtime, Smarter JIT, and AI-Ready Improvements](https://abp.io/community/articles/dotnet-11-preview-1-highlights-hspp3o5x)
62+
* [TOON vs JSON for LLM Prompts in ABP: Token-Efficient Structured Context](https://abp.io/community/articles/toon-vs-json-b4rn2avd)
63+
* [Fahri Gedik](https://abp.io/community/members/fahrigedik):
64+
* [Building a Multi-Agent AI System with A2A, MCP, and ADK in .NET](https://abp.io/community/articles/building-a-multiagent-ai-system-with-a2a-mcp-iefdehyx)
65+
* [Async Chain of Persistence Pattern: Designing for Failure in Event-Driven Systems](https://abp.io/community/articles/async-chain-of-persistence-pattern-wzjuy4gl)
66+
* [Alper Ebiçoğlu](https://abp.io/community/members/alper):
67+
* [NDC London 2026: From a Developer's Perspective and My Personal Notes about AI](https://abp.io/community/articles/ndc-london-2026-a-.net-conf-from-a-developers-perspective-07wp50yl)
68+
* [Which Open-Source PDF Libraries Are Recently Popular? A Data-Driven Look At PDF Topic](https://abp.io/community/articles/which-opensource-pdf-libraries-are-recently-popular-a-g68q78it)
69+
* [Engincan Veske](https://abp.io/community/members/EngincanV):
70+
* [Stop Spam and Toxic Users in Your App with AI](https://abp.io/community/articles/stop-spam-and-toxic-users-in-your-app-with-ai-3i0xxh0y)
71+
* [Liming Ma](https://abp.io/community/members/maliming):
72+
* [How AI Is Changing Developers](https://abp.io/community/articles/how-ai-is-changing-developers-e8y4a85f)
73+
* [Tarık Özdemir](https://abp.io/community/members/mtozdemir):
74+
* [JetBrains State of Developer Ecosystem Report 2025 — Key Insights](https://abp.io/community/articles/jetbrains-state-of-developer-ecosystem-report-2025-key-z0638q5e)
75+
* [Adnan Ali](https://abp.io/community/members/adnanaldaim):
76+
* [Integrating AI into ABP.IO Applications: The Complete Guide to Volo.Abp.AI and AI Management Module](https://abp.io/community/articles/integrating-ai-into-abp.io-applications-the-complete-guide-jc9fbjq0)
77+
78+
Thanks to the ABP Community for all the content they have published. You can also [post your ABP related (text or video) content](https://abp.io/community/posts/create) to the ABP Community.
79+
80+
## About the Next Version
81+
82+
The next feature version will be 10.2. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version.
471 KB
Loading
16.4 KB
Loading

docs/en/docs-nav.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,6 +1627,10 @@
16271627
"text": "Localization",
16281628
"path": "framework/ui/angular/localization.md"
16291629
},
1630+
{
1631+
"text": "Hybrid Localization",
1632+
"path": "framework/ui/angular/hybrid-localization.md"
1633+
},
16301634
{
16311635
"text": "Form Validation",
16321636
"path": "framework/ui/angular/form-validation.md"

docs/en/framework/infrastructure/background-jobs/tickerq.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,19 @@ public override void ConfigureServices(ServiceConfigurationContext context)
3838

3939
### UseAbpTickerQ
4040

41-
You need to call the `UseAbpTickerQ` extension method instead of `AddTickerQ` in the `OnApplicationInitialization` method of your module:
41+
You need to call the `UseAbpTickerQ` extension method in the `OnApplicationInitialization` method of your module:
4242

4343
```csharp
44-
// (default: TickerQStartMode.Immediate)
45-
app.UseAbpTickerQ(startMode: ...);
44+
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
45+
{
46+
// (default: TickerQStartMode.Immediate)
47+
context.GetHost().UseAbpTickerQ(qStartMode: ...);
48+
}
4649
```
4750

4851
### AbpBackgroundJobsTickerQOptions
4952

50-
You can configure the `TimeTicker` properties for specific jobs. For example, you can change `Priority`, `Retries` and `RetryIntervals` properties as shown below:
53+
You can configure the `TimeTickerEntity` properties for specific jobs. For example, you can change `Priority`, `Retries` and `RetryIntervals` properties as shown below:
5154

5255
```csharp
5356
Configure<AbpBackgroundJobsTickerQOptions>(options =>
@@ -56,11 +59,10 @@ Configure<AbpBackgroundJobsTickerQOptions>(options =>
5659
{
5760
Retries = 3,
5861
RetryIntervals = new[] {30, 60, 120}, // Retry after 30s, 60s, then 2min
59-
Priority = TickerTaskPriority.High
62+
Priority = TickerTaskPriority.High,
6063

61-
// Optional batching
62-
//BatchParent = Guid.Parse("...."),
63-
//BatchRunCondition = BatchRunCondition.OnSuccess
64+
// Optional: run condition for chained jobs
65+
//RunCondition = RunCondition.OnSuccess
6466
});
6567

6668
options.AddJobConfiguration<MyBackgroundJob2>(new AbpBackgroundJobsTimeTickerConfiguration()
@@ -74,7 +76,7 @@ Configure<AbpBackgroundJobsTickerQOptions>(options =>
7476

7577
### Add your own TickerQ Background Jobs Definitions
7678

77-
ABP will handle the TickerQ job definitions by `AbpTickerQFunctionProvider` service. You shouldn't use `TickerFunction` to add your own job definitions. You can inject and use the `AbpTickerQFunctionProvider` to add your own definitions and use `ITimeTickerManager<TimeTicker>` or `ICronTickerManager<CronTicker>` to manage the jobs.
79+
ABP will handle the TickerQ job definitions by `AbpTickerQFunctionProvider` service. You shouldn't use `TickerFunction` to add your own job definitions. You can inject and use the `AbpTickerQFunctionProvider` to add your own definitions and use `ITimeTickerManager<TimeTickerEntity>` or `ICronTickerManager<CronTickerEntity>` to manage the jobs.
7880

7981
For example, you can add a `CleanupJobs` job definition in the `OnPreApplicationInitializationAsync` method of your module:
8082

@@ -96,7 +98,7 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati
9698
abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) =>
9799
{
98100
var service = new CleanupJobs(); // Or get it from the serviceProvider
99-
var request = await TickerRequestProvider.GetRequestAsync<string>(serviceProvider, tickerFunctionContext.Id, tickerFunctionContext.Type);
101+
var request = await TickerRequestProvider.GetRequestAsync<string>(tickerFunctionContext, cancellationToken);
100102
var genericContext = new TickerFunctionContext<string>(tickerFunctionContext, request);
101103
await service.CleanupLogsAsync(genericContext, cancellationToken);
102104
})));
@@ -105,11 +107,11 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati
105107
}
106108
```
107109

108-
And then you can add a job by using the `ITimeTickerManager<TimeTicker>`:
110+
And then you can add a job by using the `ITimeTickerManager<TimeTickerEntity>`:
109111

110112
```csharp
111-
var timeTickerManager = context.ServiceProvider.GetRequiredService<ITimeTickerManager<TimeTicker>>();
112-
await timeTickerManager.AddAsync(new TimeTicker
113+
var timeTickerManager = context.ServiceProvider.GetRequiredService<ITimeTickerManager<TimeTickerEntity>>();
114+
await timeTickerManager.AddAsync(new TimeTickerEntity
113115
{
114116
Function = nameof(CleanupJobs),
115117
ExecutionTime = DateTime.UtcNow.AddSeconds(5),

docs/en/framework/infrastructure/background-workers/tickerq.md

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,14 @@ public override void ConfigureServices(ServiceConfigurationContext context)
3636

3737
### UseAbpTickerQ
3838

39-
You need to call the `UseAbpTickerQ` extension method instead of `AddTickerQ` in the `OnApplicationInitialization` method of your module:
39+
You need to call the `UseAbpTickerQ` extension method in the `OnApplicationInitialization` method of your module:
4040

4141
```csharp
42-
// (default: TickerQStartMode.Immediate)
43-
app.UseAbpTickerQ(startMode: ...);
42+
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
43+
{
44+
// (default: TickerQStartMode.Immediate)
45+
context.GetHost().UseAbpTickerQ(qStartMode: ...);
46+
}
4447
```
4548

4649
### AbpBackgroundWorkersTickerQOptions
@@ -61,7 +64,7 @@ Configure<AbpBackgroundWorkersTickerQOptions>(options =>
6164

6265
### Add your own TickerQ Background Worker Definitions
6366

64-
ABP will handle the TickerQ job definitions by `AbpTickerQFunctionProvider` service. You shouldn't use `TickerFunction` to add your own job definitions. You can inject and use the `AbpTickerQFunctionProvider` to add your own definitions and use `ITimeTickerManager<TimeTicker>` or `ICronTickerManager<CronTicker>` to manage the jobs.
67+
ABP will handle the TickerQ job definitions by `AbpTickerQFunctionProvider` service. You shouldn't use `TickerFunction` to add your own job definitions. You can inject and use the `AbpTickerQFunctionProvider` to add your own definitions and use `ITimeTickerManager<TimeTickerEntity>` or `ICronTickerManager<CronTickerEntity>` to manage the jobs.
6568

6669
For example, you can add a `CleanupJobs` job definition in the `OnPreApplicationInitializationAsync` method of your module:
6770

@@ -83,7 +86,7 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati
8386
abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) =>
8487
{
8588
var service = new CleanupJobs(); // Or get it from the serviceProvider
86-
var request = await TickerRequestProvider.GetRequestAsync<string>(serviceProvider, tickerFunctionContext.Id, tickerFunctionContext.Type);
89+
var request = await TickerRequestProvider.GetRequestAsync<string>(tickerFunctionContext, cancellationToken);
8790
var genericContext = new TickerFunctionContext<string>(tickerFunctionContext, request);
8891
await service.CleanupLogsAsync(genericContext, cancellationToken);
8992
})));
@@ -92,11 +95,11 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati
9295
}
9396
```
9497

95-
And then you can add a job by using the `ICronTickerManager<CronTicker>`:
98+
And then you can add a job by using the `ICronTickerManager<CronTickerEntity>`:
9699

97100
```csharp
98-
var cronTickerManager = context.ServiceProvider.GetRequiredService<ICronTickerManager<CronTicker>>();
99-
await cronTickerManager.AddAsync(new CronTicker
101+
var cronTickerManager = context.ServiceProvider.GetRequiredService<ICronTickerManager<CronTickerEntity>>();
102+
await cronTickerManager.AddAsync(new CronTickerEntity
100103
{
101104
Function = nameof(CleanupJobs),
102105
Expression = "0 */6 * * *", // Every 6 hours
@@ -106,13 +109,13 @@ await cronTickerManager.AddAsync(new CronTicker
106109
});
107110
```
108111

109-
You can specify a cron expression instead of use `ICronTickerManager<CronTicker>` to add a worker:
112+
You can specify a cron expression instead of using `ICronTickerManager<CronTickerEntity>` to add a worker:
110113

111114
```csharp
112115
abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) =>
113116
{
114117
var service = new CleanupJobs();
115-
var request = await TickerRequestProvider.GetRequestAsync<string>(serviceProvider, tickerFunctionContext.Id, tickerFunctionContext.Type);
118+
var request = await TickerRequestProvider.GetRequestAsync<string>(tickerFunctionContext, cancellationToken);
116119
var genericContext = new TickerFunctionContext<string>(tickerFunctionContext, request);
117120
await service.CleanupLogsAsync(genericContext, cancellationToken);
118121
})));

0 commit comments

Comments
 (0)