pub struct JetStreamOptions {
pub message_id: Option<String>,
pub expect_last_sequence: Option<u64>,
pub expect_last_subject_sequence: Option<u64>,
pub expect_last_message_id: Option<String>,
}Expand description
What one JetStream publish states about itself, over and above its subject and payload.
Every field is optional, and a call carries only what it set. These are protocol fields the server reads, not headers of the application: a deduplication id, and the three expectations that hold an optimistic-concurrency chain together.
A publish that violates an expectation is refused by the stream, and the publish returns
NatsError::JetStream. That is the point of stating one: the writer learns that the stream
moved under it instead of appending over someone else’s message.
The fields are public because a test names the value the publish carried, as
tb.out::<Marker>().assert_called_once().with_options(&JetStreamOptions { .. }).
§Examples
use std::error::Error;
use ruststream::testing::TestApp;
use ruststream_nats::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Deserialize, Serialize, Outgoing)]
struct Order {
id: u64,
}
#[derive(Serialize, Outgoing)]
#[outgoing(name = "archive.orders")]
struct Archived {
id: u64,
}
#[derive(OutSlot)]
#[publishes(Archived)]
struct Archive;
#[subscriber("orders.created")]
async fn archive(
order: &Order,
Out(out): Out<impl Publisher<Options = JetStreamOptions>, Archive>,
) -> HandlerOutcome {
let sent = out
.message(&Archived { id: order.id })
.message_id(format!("order-{}", order.id))
.publish()
.await;
if sent.is_err() {
return HandlerOutcome::retry();
}
HandlerOutcome::ack()
}
pub fn app() -> impl App {
RustStream::new(AppInfo::new("archive", "0.1.0"))
.with_broker(NatsBroker::new("nats://localhost:4222"), |b| {
b.include(archive)
.out(Archive, JetStreamPublish::default().expect_stream("ARCHIVE"))
.build();
})
}
pub async fn archives_once_per_order() -> Result<(), Box<dyn Error>> {
let tb = TestApp::start(app()).await?;
tb.broker::<NatsBroker>()
.message(&Order { id: 7 })
.to("orders.created")
.publish()
.await?;
tb.out::<Archive>()
.assert_called_once()
.with_options(&JetStreamOptions {
message_id: Some("order-7".into()),
..JetStreamOptions::default()
});
tb.shutdown().await?;
Ok(())
}Fields§
§message_id: Option<String>The Nats-Msg-Id the stream’s deduplication window recognises a repeat by.
expect_last_sequence: Option<u64>Requires the stream’s last sequence to be this at the moment of the publish.
expect_last_subject_sequence: Option<u64>Requires the last sequence on the published subject to be this.
expect_last_message_id: Option<String>Requires the stream’s last Nats-Msg-Id to be this.
Trait Implementations§
Source§impl Clone for JetStreamOptions
impl Clone for JetStreamOptions
Source§impl Debug for JetStreamOptions
impl Debug for JetStreamOptions
Source§impl Default for JetStreamOptions
impl Default for JetStreamOptions
impl Eq for JetStreamOptions
Source§impl PartialEq for JetStreamOptions
impl PartialEq for JetStreamOptions
impl StructuralPartialEq for JetStreamOptions
Auto Trait Implementations§
impl Freeze for JetStreamOptions
impl RefUnwindSafe for JetStreamOptions
impl Send for JetStreamOptions
impl Sync for JetStreamOptions
impl Unpin for JetStreamOptions
impl UnsafeUnpin for JetStreamOptions
impl UnwindSafe for JetStreamOptions
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more