pub struct NatsPublisher { /* private fields */ }Expand description
The live Core NATS publisher. Cheap to clone.
Exists only from a ConnectedNatsBroker, so it always has a connection. It aliases that
connection, though, and may outlive it: after the broker shuts down every publish reports
NatsError::Closed instead of silently succeeding against a dead connection.
NATS correlates a reply with its request natively, so this publisher implements
RequestReply: request(msg, timeout) publishes with a reply
inbox and resolves with the reply, or with NatsError::RequestTimeout when nothing answers
in time.
§Examples
use std::io;
use std::time::Duration;
use ruststream::OutgoingMessage;
use ruststream_nats::prelude::*;
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("requester", "0.1.0")).with_broker(
NatsBroker::new("nats://localhost:4222"),
|b| {
b.after_startup(Publish, async move |requester| -> io::Result<()> {
let reply = requester
.request(
OutgoingMessage::new("questions", b"what is the answer?"),
Duration::from_secs(2),
)
.await
.map_err(io::Error::other)?;
tracing::info!(answer = %String::from_utf8_lossy(reply.payload()), "replied");
Ok(())
});
},
)
}Trait Implementations§
Source§impl Clone for NatsPublisher
impl Clone for NatsPublisher
Source§impl Debug for NatsPublisher
impl Debug for NatsPublisher
Source§impl Publisher for NatsPublisher
impl Publisher for NatsPublisher
Source§type Payload = Take
type Payload = Take
The client keeps the payload: async-nats publishes a Bytes, so the buffer the
framework wrote is handed over instead of being read and copied.
Source§type Options = ()
type Options = ()
Core NATS says nothing about a message beyond its subject, its payload and its headers, so
there is no per-message setting to carry. JetStream has four, and they live on
JetStreamOptions.
Source§async fn publish(
&self,
msg: OutgoingMessage<'_, BytesMut>,
_options: Option<&Self::Options>,
) -> Result<(), Self::Error>
async fn publish( &self, msg: OutgoingMessage<'_, BytesMut>, _options: Option<&Self::Options>, ) -> Result<(), Self::Error>
§Cancel safety
Core NATS publishing is fire-and-forget: the message is handed to the connection’s writer without waiting for the server. Dropping the future may leave the message either sent or unsent, with no way to tell which.
Source§impl RequestReply for NatsPublisher
impl RequestReply for NatsPublisher
Auto Trait Implementations§
impl !RefUnwindSafe for NatsPublisher
impl !UnwindSafe for NatsPublisher
impl Freeze for NatsPublisher
impl Send for NatsPublisher
impl Sync for NatsPublisher
impl Unpin for NatsPublisher
impl UnsafeUnpin for NatsPublisher
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<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 moreSource§impl<P> PublishExt for P
impl<P> PublishExt for P
Source§fn message<'a, T>(
&'a self,
value: &'a T,
) -> PublishBuilder<&'a Self, MessageBody<'a, T>, UnnamedCodec, HeadersUnset, <T as OutgoingDestination>::Form>where
T: OutgoingDestination,
fn message<'a, T>(
&'a self,
value: &'a T,
) -> PublishBuilder<&'a Self, MessageBody<'a, T>, UnnamedCodec, HeadersUnset, <T as OutgoingDestination>::Form>where
T: OutgoingDestination,
#[derive(Outgoing)] value, encoded with the crate’s
default codec (name another one with with_codec(..)). A
Serialized value’s bytes leave as they are instead - the wire is
the type’s own (MessageWire), and no codec runs on it. Read moreSource§fn begin(
&self,
) -> impl Future<Output = Result<TransactionScope<'_, Self, UnnamedCodec, AnyDeclared>, Self::Error>> + Sendwhere
Self: Sized + TransactionalPublisher,
fn begin(
&self,
) -> impl Future<Output = Result<TransactionScope<'_, Self, UnnamedCodec, AnyDeclared>, Self::Error>> + Sendwhere
Self: Sized + TransactionalPublisher,
TransactionScope that
owns it. Read moreSource§fn owned_transaction(
&self,
) -> impl Future<Output = Result<TypedTransaction<Self::Transaction, UnnamedCodec, AnyDeclared>, Self::Error>> + Sendwhere
Self: Sized + OwnedTransactions,
fn owned_transaction(
&self,
) -> impl Future<Output = Result<TypedTransaction<Self::Transaction, UnnamedCodec, AnyDeclared>, Self::Error>> + Sendwhere
Self: Sized + OwnedTransactions,
TypedTransaction that owns it. Read more