Skip to main content

IHostedService

Trait IHostedService 

Source
pub trait IHostedService: Send + Sync {
    // Required method
    fn start<'life0, 'async_trait>(
        &'life0 self,
    ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
       where 'life0: 'async_trait,
             Self: 'async_trait;

    // Provided method
    fn stop<'life0, 'async_trait>(
        &'life0 self,
    ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
       where 'life0: 'async_trait,
             Self: 'async_trait { ... }
}
Expand description

Background service that is started when the host starts and stopped when the host performs a graceful shutdown.

Analogous to ASP.NET Core’s IHostedService.

Use this for:

  • Data initialization / seeding at application startup
  • Background polling loops
  • Queue consumers
  • Connection pool warmup

§Example

ⓘ
#[derive(Default)]
struct DbInitService;

#[async_trait]
impl IHostedService for DbInitService {
    async fn start(&self) -> Result<()> {
        tracing::info!("[DbInitService] Running migrations...");
        run_migrations().await?;
        tracing::info!("[DbInitService] Seeding data...");
        seed_data().await?;
        Ok(())
    }

    async fn stop(&self) -> Result<()> {
        tracing::info!("[DbInitService] Shutting down...");
        Ok(())
    }
}

Required Methods§

Source

fn start<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Called when the host starts.

Services start in registration order and the host waits for all of them before accepting requests. Each start() runs inside its own DI scope: dispatch_provider().get_owned::<DbContext>() resolves scoped dependencies against that scope, and they are disposed when the call returns instead of being cached on the root provider. If one start() fails, the services that already started are stopped again in reverse order before the host reports the error.

Provided Methods§

Source

fn stop<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Called during a graceful shutdown.

The host stops the services that started, in reverse start order (the last dependency to start is the first to stop), with a timeout per service so one stuck service cannot block the process forever. Like start(), each stop() runs inside a fresh DI scope.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§