Worker Loop Structure
pub async fn run_worker(
sqs: Arc<SqsClient>,
db: Arc<DynamoClient>,
queue_url: String,
cancel: CancellationToken,
metrics: WorkerMetrics,
) {
let mut set = JoinSet::new();
loop {
tokio::select! {
_ = cancel.cancelled() => break,
msgs = poll_sqs(&sqs, &queue_url) => {
for msg in msgs {
let ctx = (sqs.clone(), db.clone(), queue_url.clone(), metrics.clone());
set.spawn(process_message(ctx, msg));
}
}
}
while let Some(res) = set.try_join_next() {
if let Err(e) = res { tracing::error!(error=%e, "task panicked"); }
}
}
set.shutdown().await;
}