Skip to content

Commit 3efd085

Browse files
authored
Workflow purger (danielgerlag#402)
1 parent 1b49ec1 commit 3efd085

File tree

18 files changed

+137
-22
lines changed

18 files changed

+137
-22
lines changed

ReleaseNotes/2.1.2.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Workflow Core 2.1.2
2+
3+
* Adds a feature to purge old workflows from the persistence store.
4+
5+
New `IWorkflowPurger` service that can be injected from the IoC container
6+
```c#
7+
Task PurgeWorkflows(WorkflowStatus status, DateTime olderThan)
8+
```
9+
Implementations are currently only for SQL Server, Postgres and MongoDB

WorkflowCore.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReleaseNotes", "ReleaseNote
100100
ReleaseNotes\1.9.3.md = ReleaseNotes\1.9.3.md
101101
ReleaseNotes\2.0.0.md = ReleaseNotes\2.0.0.md
102102
ReleaseNotes\2.1.0.md = ReleaseNotes\2.1.0.md
103+
ReleaseNotes\2.1.2.md = ReleaseNotes\2.1.2.md
103104
EndProjectSection
104105
EndProject
105106
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowCore.Sample14", "src\samples\WorkflowCore.Sample14\WorkflowCore.Sample14.csproj", "{6BC66637-B42A-4334-ADFB-DBEC9F29D293}"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using WorkflowCore.Models;
4+
5+
namespace WorkflowCore.Interface
6+
{
7+
public interface IWorkflowPurger
8+
{
9+
Task PurgeWorkflows(WorkflowStatus status, DateTime olderThan);
10+
}
11+
}

src/WorkflowCore/WorkflowCore.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
1616
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
1717
<Description>Workflow Core is a light weight workflow engine targeting .NET Standard.</Description>
18-
<Version>2.1.1</Version>
19-
<AssemblyVersion>2.1.1.0</AssemblyVersion>
20-
<FileVersion>2.1.1.0</FileVersion>
18+
<Version>2.1.2</Version>
19+
<AssemblyVersion>2.1.2.0</AssemblyVersion>
20+
<FileVersion>2.1.2.0</FileVersion>
2121
<PackageReleaseNotes></PackageReleaseNotes>
2222
<PackageIconUrl>https://github.com/danielgerlag/workflow-core/raw/master/src/logo.png</PackageIconUrl>
2323
</PropertyGroup>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.Linq;
3+
using System.Linq.Dynamic.Core;
4+
using System.Threading.Tasks;
5+
using Microsoft.EntityFrameworkCore;
6+
using WorkflowCore.Interface;
7+
using WorkflowCore.Models;
8+
using WorkflowCore.Persistence.EntityFramework.Interfaces;
9+
using WorkflowCore.Persistence.EntityFramework.Models;
10+
11+
namespace WorkflowCore.Persistence.EntityFramework.Services
12+
{
13+
public class WorkflowPurger : IWorkflowPurger
14+
{
15+
private readonly IWorkflowDbContextFactory _contextFactory;
16+
17+
public WorkflowPurger(IWorkflowDbContextFactory contextFactory)
18+
{
19+
_contextFactory = contextFactory;
20+
}
21+
22+
public async Task PurgeWorkflows(WorkflowStatus status, DateTime olderThan)
23+
{
24+
var olderThanUtc = olderThan.ToUniversalTime();
25+
using (var db = ConstructDbContext())
26+
{
27+
var workflows = await db.Set<PersistedWorkflow>().Where(x => x.Status == status && x.CompleteTime < olderThanUtc).ToListAsync();
28+
foreach (var wf in workflows)
29+
{
30+
foreach (var pointer in wf.ExecutionPointers)
31+
{
32+
foreach (var extAttr in pointer.ExtensionAttributes)
33+
{
34+
db.Remove(extAttr);
35+
}
36+
37+
db.Remove(pointer);
38+
}
39+
db.Remove(wf);
40+
}
41+
42+
await db.SaveChangesAsync();
43+
}
44+
}
45+
46+
47+
private WorkflowDbContext ConstructDbContext()
48+
{
49+
return _contextFactory.Build();
50+
}
51+
}
52+
}

src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
1515
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
1616
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
17-
<Version>2.0.1</Version>
17+
<Version>2.1.1</Version>
1818
<Description>Base package for Workflow-core peristence providers using entity framework</Description>
19-
<AssemblyVersion>2.0.1.0</AssemblyVersion>
20-
<FileVersion>2.0.1.0</FileVersion>
19+
<AssemblyVersion>2.1.1.0</AssemblyVersion>
20+
<FileVersion>2.1.1.0</FileVersion>
2121
</PropertyGroup>
2222

2323
<ItemGroup>

src/providers/WorkflowCore.Persistence.MongoDB/ServiceCollectionExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Linq;
55
using System.Threading.Tasks;
6+
using WorkflowCore.Interface;
67
using WorkflowCore.Models;
78
using WorkflowCore.Persistence.MongoDB.Services;
89

@@ -18,6 +19,12 @@ public static WorkflowOptions UseMongoDB(this WorkflowOptions options, string mo
1819
var db = client.GetDatabase(databaseName);
1920
return new MongoPersistenceProvider(db);
2021
});
22+
options.Services.AddTransient<IWorkflowPurger>(sp =>
23+
{
24+
var client = new MongoClient(mongoUrl);
25+
var db = client.GetDatabase(databaseName);
26+
return new WorkflowPurger(db);
27+
});
2128
return options;
2229
}
2330
}

src/providers/WorkflowCore.Persistence.MongoDB/Services/MongoPersistenceProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace WorkflowCore.Persistence.MongoDB.Services
1313
{
1414
public class MongoPersistenceProvider : IPersistenceProvider
1515
{
16+
internal const string WorkflowCollectionName = "wfc.workflows";
1617
private readonly IMongoDatabase _database;
1718

1819
public MongoPersistenceProvider(IMongoDatabase database)
@@ -77,7 +78,7 @@ static void CreateIndexes(MongoPersistenceProvider instance)
7778
}
7879
}
7980

80-
private IMongoCollection<WorkflowInstance> WorkflowInstances => _database.GetCollection<WorkflowInstance>("wfc.workflows");
81+
private IMongoCollection<WorkflowInstance> WorkflowInstances => _database.GetCollection<WorkflowInstance>(WorkflowCollectionName);
8182

8283
private IMongoCollection<EventSubscription> EventSubscriptions => _database.GetCollection<EventSubscription>("wfc.subscriptions");
8384

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using MongoDB.Driver;
4+
using WorkflowCore.Models;
5+
using WorkflowCore.Interface;
6+
7+
namespace WorkflowCore.Persistence.MongoDB.Services
8+
{
9+
public class WorkflowPurger : IWorkflowPurger
10+
{
11+
private readonly IMongoDatabase _database;
12+
private IMongoCollection<WorkflowInstance> WorkflowInstances => _database.GetCollection<WorkflowInstance>(MongoPersistenceProvider.WorkflowCollectionName);
13+
14+
15+
public WorkflowPurger(IMongoDatabase database)
16+
{
17+
_database = database;
18+
}
19+
20+
public async Task PurgeWorkflows(WorkflowStatus status, DateTime olderThan)
21+
{
22+
var olderThanUtc = olderThan.ToUniversalTime();
23+
await WorkflowInstances.DeleteManyAsync(x => x.Status == status && x.CompleteTime < olderThanUtc);
24+
}
25+
}
26+
}

src/providers/WorkflowCore.Persistence.MongoDB/WorkflowCore.Persistence.MongoDB.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
1515
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
1616
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
17-
<Version>2.0.0</Version>
17+
<Version>2.1.0</Version>
1818
<Description>Provides support to persist workflows running on Workflow Core to a MongoDB database.</Description>
19-
<AssemblyVersion>2.0.0.0</AssemblyVersion>
20-
<FileVersion>2.0.0.0</FileVersion>
19+
<AssemblyVersion>2.1.0.0</AssemblyVersion>
20+
<FileVersion>2.1.0.0</FileVersion>
2121
</PropertyGroup>
2222

2323
<ItemGroup>

src/providers/WorkflowCore.Persistence.MySQL/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using Microsoft.EntityFrameworkCore.Infrastructure;
3+
using WorkflowCore.Interface;
34
using WorkflowCore.Models;
45
using WorkflowCore.Persistence.EntityFramework.Services;
56
using WorkflowCore.Persistence.MySQL;
@@ -11,6 +12,7 @@ public static class ServiceCollectionExtensions
1112
public static WorkflowOptions UseMySQL(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB, Action<MySqlDbContextOptionsBuilder> mysqlOptionsAction = null)
1213
{
1314
options.UsePersistence(sp => new EntityFrameworkPersistenceProvider(new MysqlContextFactory(connectionString, mysqlOptionsAction), canCreateDB, canMigrateDB));
15+
options.Services.AddTransient<IWorkflowPurger>(sp => new WorkflowPurger(new MysqlContextFactory(connectionString, mysqlOptionsAction)));
1416
return options;
1517
}
1618
}

src/providers/WorkflowCore.Persistence.MySQL/WorkflowCore.Persistence.MySQL.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
1717
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
1818
<Description>Provides support to persist workflows running on Workflow Core to a MySQL database.</Description>
19-
<Version>1.2.0</Version>
20-
<AssemblyVersion>1.2.0.0</AssemblyVersion>
21-
<FileVersion>1.2.0.0</FileVersion>
19+
<Version>1.2.1</Version>
20+
<AssemblyVersion>1.2.1.0</AssemblyVersion>
21+
<FileVersion>1.2.1.0</FileVersion>
2222
</PropertyGroup>
2323

2424
<ItemGroup>

src/providers/WorkflowCore.Persistence.PostgreSQL/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Threading.Tasks;
5+
using WorkflowCore.Interface;
56
using WorkflowCore.Models;
67
using WorkflowCore.Persistence.EntityFramework.Services;
78
using WorkflowCore.Persistence.PostgreSQL;
@@ -14,6 +15,7 @@ public static WorkflowOptions UsePostgreSQL(this WorkflowOptions options,
1415
string connectionString, bool canCreateDB, bool canMigrateDB, string schemaName="wfc")
1516
{
1617
options.UsePersistence(sp => new EntityFrameworkPersistenceProvider(new PostgresContextFactory(connectionString, schemaName), canCreateDB, canMigrateDB));
18+
options.Services.AddTransient<IWorkflowPurger>(sp => new WorkflowPurger(new PostgresContextFactory(connectionString, schemaName)));
1719
return options;
1820
}
1921
}

src/providers/WorkflowCore.Persistence.PostgreSQL/WorkflowCore.Persistence.PostgreSQL.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
1616
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
1717
<Description>Provides support to persist workflows running on Workflow Core to a PostgreSQL database.</Description>
18-
<Version>2.0.2</Version>
19-
<AssemblyVersion>2.0.2.0</AssemblyVersion>
20-
<FileVersion>2.0.2.0</FileVersion>
18+
<Version>2.1.1</Version>
19+
<AssemblyVersion>2.1.1.0</AssemblyVersion>
20+
<FileVersion>2.1.1.0</FileVersion>
2121
</PropertyGroup>
2222

2323
<ItemGroup>

src/providers/WorkflowCore.Persistence.SqlServer/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using WorkflowCore.Interface;
23
using WorkflowCore.Models;
34
using WorkflowCore.Persistence.EntityFramework.Interfaces;
45
using WorkflowCore.Persistence.EntityFramework.Services;
@@ -11,6 +12,7 @@ public static class ServiceCollectionExtensions
1112
public static WorkflowOptions UseSqlServer(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB)
1213
{
1314
options.UsePersistence(sp => new EntityFrameworkPersistenceProvider(new SqlContextFactory(connectionString), canCreateDB, canMigrateDB));
15+
options.Services.AddTransient<IWorkflowPurger>(sp => new WorkflowPurger(new SqlContextFactory(connectionString)));
1416
return options;
1517
}
1618
}

src/providers/WorkflowCore.Persistence.SqlServer/WorkflowCore.Persistence.SqlServer.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
1616
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
1717
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
18-
<Version>2.0.1</Version>
18+
<Version>2.1.1</Version>
1919
<Description>Provides support to persist workflows running on Workflow Core to a SQL Server database.</Description>
20-
<AssemblyVersion>2.0.1.0</AssemblyVersion>
21-
<FileVersion>2.0.1.0</FileVersion>
20+
<AssemblyVersion>2.1.1.0</AssemblyVersion>
21+
<FileVersion>2.1.1.0</FileVersion>
2222
</PropertyGroup>
2323

2424
<ItemGroup>

src/providers/WorkflowCore.Persistence.Sqlite/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Threading.Tasks;
5+
using WorkflowCore.Interface;
56
using WorkflowCore.Models;
67
using WorkflowCore.Persistence.EntityFramework.Services;
78
using WorkflowCore.Persistence.Sqlite;
@@ -13,6 +14,7 @@ public static class ServiceCollectionExtensions
1314
public static WorkflowOptions UseSqlite(this WorkflowOptions options, string connectionString, bool canCreateDB)
1415
{
1516
options.UsePersistence(sp => new EntityFrameworkPersistenceProvider(new SqliteContextFactory(connectionString), canCreateDB, false));
17+
options.Services.AddTransient<IWorkflowPurger>(sp => new WorkflowPurger(new SqliteContextFactory(connectionString)));
1618
return options;
1719
}
1820
}

src/providers/WorkflowCore.Persistence.Sqlite/WorkflowCore.Persistence.Sqlite.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
1717
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
1818
<Description>Provides support to persist workflows running on Workflow Core to a Sqlite database.</Description>
19-
<Version>1.9.2</Version>
20-
<AssemblyVersion>1.9.2.0</AssemblyVersion>
21-
<FileVersion>1.9.2.0</FileVersion>
19+
<Version>1.9.3</Version>
20+
<AssemblyVersion>1.9.3.0</AssemblyVersion>
21+
<FileVersion>1.9.3.0</FileVersion>
2222
</PropertyGroup>
2323

2424
<ItemGroup>

0 commit comments

Comments
 (0)