pub struct ZmqQueuePublisher { /* private fields */ }Expand description
Publishes into the queue over a PUSH socket of its own.
Paired by the runtime on the bind side, the socket listens from the moment the service starts,
so a PULL peer that dials the endpoint connects before the first push. A publisher that dials,
or one taken from a publisher() constructor, attaches on its first publish.
On an endpoint a subscription of this service bound, the socket dials that subscription, so a
publish reaches it and nothing else: one under the subscription’s own name (a retry copy, a
job the service feeds itself) is sent, and one under any other name returns
ZmqError::Send rather than arriving at the subscription as its next delivery. On an
endpoint a subscription of this service dials, the peer there only pushes, so every publish
returns ZmqError::Send naming that subscription.
A publisher that sends before any subscription of its service binds the endpoint listens on the endpoint itself, for peers to dial. When a subscription of the same broker binds the endpoint later, the publisher gives the endpoint up first, on a fixed port and on port zero alike, and its next publish dials that subscription.
§Examples
A worker’s results leave through a queue on an endpoint of their own, here one a sink binds.
The jobs arrive on the socket the jobs subscription binds, and that socket takes every
message pushed into it: a result published there would come back as the next job, so the
worker’s own publisher refuses it, and the mount binds the reply to the second broker:
use ruststream_zeromq::queue::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Deserialize)]
struct Job {
id: u64,
}
#[derive(Serialize, Outgoing)]
#[outgoing(name = "results")]
struct Done {
id: u64,
}
#[subscriber("jobs", reply)]
async fn work(job: &Job) -> Done {
Done { id: job.id }
}
#[ruststream::app]
fn app() -> impl App {
let results = ZmqQueue::new(ZmqEndpoint::connect("tcp://sink:5556")).bindable();
let to_results = results.bind(Publish);
RustStream::new(AppInfo::new("worker", "0.1.0"))
.with_broker(ZmqQueue::new(ZmqEndpoint::bind("tcp://0.0.0.0:5555")), |b| {
b.include(work).out_reply(to_results);
})
.with_broker(results, |_b| {})
}Trait Implementations§
Source§impl Clone for ZmqQueuePublisher
impl Clone for ZmqQueuePublisher
Source§impl Debug for ZmqQueuePublisher
impl Debug for ZmqQueuePublisher
Source§impl Publisher for ZmqQueuePublisher
impl Publisher for ZmqQueuePublisher
Source§type Payload = Take
type Payload = Take
A frame owns its bytes: the payload becomes the message’s third frame and the socket keeps it until the send completes.
Source§type Options = ()
type Options = ()
ZMTP carries no per-message setting: a send takes the frames and nothing else, so there is nothing for a call site to adjust. The Publishing page shows what a publish carries.
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
Cancel-safe. A publish dropped before the socket takes its message sends nothing. One dropped mid-send, while the peer applies back-pressure, leaves its message with the publisher: the next publish through it or a clone completes that send before its own, and a failure of it is logged against its name.
Auto Trait Implementations§
impl !RefUnwindSafe for ZmqQueuePublisher
impl !UnwindSafe for ZmqQueuePublisher
impl Freeze for ZmqQueuePublisher
impl Send for ZmqQueuePublisher
impl Sync for ZmqQueuePublisher
impl Unpin for ZmqQueuePublisher
impl UnsafeUnpin for ZmqQueuePublisher
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