@@ -46,25 +46,40 @@ actor BreezeLambdaService<T: BreezeCodable>: Service {
4646
4747 func run( ) async throws {
4848 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 {
5054 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)
5655 try await runtime. run ( )
5756 } catch {
58- logger. error ( " \( error. localizedDescription) " )
57+ self . logger. error ( " \( error. localizedDescription) " )
5958 throw error
6059 }
6160 } 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 ( )
6778 }
6879 }
80+ for await _ in cancelOrGracefulShutdown {
81+ try await onGracefulShutdown ( )
82+ task. cancel ( )
83+ }
6984 }
7085}
0 commit comments