跳到主要内容
本页尚未翻译

下面显示的是英文原文。

priority

priority sets the AMQP priority of one message; LapinPublish::priority sets it for every message of a policy.

A policy that sets no priority sends none. RabbitMQ orders deliveries by priority only on a queue declared with x-max-priority, and a higher priority counts as that maximum. On any other queue the priority travels to the consumer and orders nothing. A delivery reports it under PRIORITY_HEADER as decimal digits, and the handler reads it like any other header. A delayed redelivery keeps the priority its original delivery reported.

Example​

A reading over 90 degrees raises an alert at priority 9, a warm one at the policy's 1. The alerts queue orders by priority, and its consumer pages someone for the urgent ones.

/// A reading over 90 degrees raises an alert at priority 9; a warm one takes the policy's 1.
#[subscriber(RabbitQueue::new("readings"))]
async fn watch(
reading: &Reading,
Out(alerts): Out<impl Publisher<Options = LapinPublishOptions>, Alerts>,
) -> HandlerOutcome {
if reading.celsius < 60 {
return HandlerOutcome::ack();
}
let alert = Alert {
sensor: reading.sensor.clone(),
};
let sent = if reading.celsius > 90 {
alerts.message(&alert).priority(9).publish().await
} else {
alerts.message(&alert).publish().await
};
if sent.is_err() {
return HandlerOutcome::retry();
}
HandlerOutcome::ack()
}

/// The alerts queue orders by priority, and the consumer pages someone for the urgent ones.
#[subscriber(RabbitQueue::new("alerts").argument("x-max-priority", AMQPValue::LongLongInt(10)))]
async fn triage(
alert: &Alert,
ctx: &mut Context<'_>,
Out(pager): Out<impl Publisher>,
) -> HandlerOutcome {
let priority = ctx.headers().get_str(PRIORITY_HEADER).unwrap_or("0");
if priority != "9" {
tracing::info!(alert.sensor, priority, "alert logged");
return HandlerOutcome::ack();
}
let page = Page {
sensor: alert.sensor.clone(),
};
if pager.message(&page).publish().await.is_err() {
return HandlerOutcome::retry();
}
HandlerOutcome::ack()
}

#[ruststream::app]
fn app() -> impl App {
let broker = LapinBroker::new("amqp://localhost:5672").declare_topology(true);
RustStream::new(AppInfo::new("monitoring", "0.1.0")).with_broker(broker, |b| {
b.include(watch)
.out(Alerts, Publish::default().priority(1))
.build();
b.include(triage)
.out(DefaultSlot, Publish::default())
.build();
})
}