@@ -46,25 +46,40 @@ actor BreezeLambdaService<T: BreezeCodable>: Service {
46
46
47
47
func run( ) async throws {
48
48
let dbManager = await dynamoDBService. dbManager ( )
49
- try await withGracefulShutdownHandler {
49
+ let breezeApi = BreezeLambdaHandler < T > ( dbManager: dbManager, operation: self . operation)
50
+ self . breezeApi = breezeApi
51
+ logger. info ( " Starting BreezeLambdaService... " )
52
+ let runtime = LambdaRuntime ( body: handler)
53
+ try await runTaskWithCancellationOnGracefulShutdown {
50
54
do {
51
- let breezeApi = BreezeLambdaHandler < T > ( dbManager: dbManager, operation: operation)
52
- self . breezeApi = breezeApi
53
- logger. info ( " Starting BreezeLambdaService... " )
54
- logger. info ( " Starting BreezeLambdaService... " )
55
- let runtime = LambdaRuntime ( body: handler)
56
55
try await runtime. run ( )
57
56
} catch {
58
- logger. error ( " \( error. localizedDescription) " )
57
+ self . logger. error ( " \( error. localizedDescription) " )
59
58
throw error
60
59
}
61
60
} onGracefulShutdown: {
62
- Task {
63
- self . logger. info ( " Gracefully stoping BreezeLambdaService ... " )
64
- try await self . dynamoDBService. gracefulShutdown ( )
65
- self . logger. info ( " BreezeLambdaService stopped. " )
66
- exit ( EXIT_SUCCESS)
61
+ self . logger. info ( " Gracefully stoping BreezeLambdaService ... " )
62
+ try await self . dynamoDBService. gracefulShutdown ( )
63
+ self . logger. info ( " BreezeLambdaService is stopped. " )
64
+ }
65
+ }
66
+
67
+ private func runTaskWithCancellationOnGracefulShutdown(
68
+ operation: @escaping @Sendable ( ) async throws -> Void ,
69
+ onGracefulShutdown: ( ) async throws -> Void
70
+ ) async throws {
71
+ let ( cancelOrGracefulShutdown, cancelOrGracefulShutdownContinuation) = AsyncStream< Void> . makeStream( )
72
+ let task = Task {
73
+ try await withTaskCancellationOrGracefulShutdownHandler {
74
+ try await operation ( )
75
+ } onCancelOrGracefulShutdown: {
76
+ cancelOrGracefulShutdownContinuation. yield ( )
77
+ cancelOrGracefulShutdownContinuation. finish ( )
67
78
}
68
79
}
80
+ for await _ in cancelOrGracefulShutdown {
81
+ try await onGracefulShutdown ( )
82
+ task. cancel ( )
83
+ }
69
84
}
70
85
}
0 commit comments