Registry

Struct Registry 

Source
pub struct Registry { /* private fields */ }
Expand description

Provides a centralized ‘registry’ of processes using any value as a key.

A registry is designed to only support a single type of Process or GenServer, you should use multiple if necessary.

Implementations§

Source§

impl Registry

Source

pub fn new<T: Into<String>>(name: T) -> Self

Constructs a new local Registry with the given name.

Names must be unique on a per-node basis.

Examples found in repository?
examples/registry.rs (line 61)
58    async fn start(&self) -> Result<Pid, ExitReason> {
59        // Spawn a registry that will take care of registering 'MySpace'.
60        let children = [
61            Registry::new("space-registry")
62                .with_start(|key| {
63                    let RegistryKey::String(id) = key else {
64                        panic!()
65                    };
66
67                    MySpace::new(id).start_link(GenServerOptions::new())
68                })
69                .with_shutdown(Shutdown::Infinity)
70                .child_spec(RegistryOptions::new())
71                .id("space-registry"),
72            ChildSpec::new("test-registry")
73                .start(move || async { Ok(Process::spawn(test_registry())) }),
74        ];
75
76        // Restart only the terminated child.
77        Supervisor::with_children(children)
78            .strategy(SupervisionStrategy::OneForOne)
79            .start_link(SupervisorOptions::new())
80            .await
81    }
Source

pub fn with_start<T, F>(self, start: T) -> Self
where T: Fn(RegistryKey) -> F + Send + Sync + 'static, F: Future<Output = Result<Pid, ExitReason>> + Send + Sync + 'static,

Assigns a start routine for the registry to be able to dynamically spawn processes.

Must return a future that resolves to Result<Pid, ExitReason>.

Examples found in repository?
examples/registry.rs (lines 62-68)
58    async fn start(&self) -> Result<Pid, ExitReason> {
59        // Spawn a registry that will take care of registering 'MySpace'.
60        let children = [
61            Registry::new("space-registry")
62                .with_start(|key| {
63                    let RegistryKey::String(id) = key else {
64                        panic!()
65                    };
66
67                    MySpace::new(id).start_link(GenServerOptions::new())
68                })
69                .with_shutdown(Shutdown::Infinity)
70                .child_spec(RegistryOptions::new())
71                .id("space-registry"),
72            ChildSpec::new("test-registry")
73                .start(move || async { Ok(Process::spawn(test_registry())) }),
74        ];
75
76        // Restart only the terminated child.
77        Supervisor::with_children(children)
78            .strategy(SupervisionStrategy::OneForOne)
79            .start_link(SupervisorOptions::new())
80            .await
81    }
Source

pub fn with_shutdown(self, shutdown: Shutdown) -> Self

Sets the method used to shutdown any registered processes once when the Registry is terminated.

Examples found in repository?
examples/registry.rs (line 69)
58    async fn start(&self) -> Result<Pid, ExitReason> {
59        // Spawn a registry that will take care of registering 'MySpace'.
60        let children = [
61            Registry::new("space-registry")
62                .with_start(|key| {
63                    let RegistryKey::String(id) = key else {
64                        panic!()
65                    };
66
67                    MySpace::new(id).start_link(GenServerOptions::new())
68                })
69                .with_shutdown(Shutdown::Infinity)
70                .child_spec(RegistryOptions::new())
71                .id("space-registry"),
72            ChildSpec::new("test-registry")
73                .start(move || async { Ok(Process::spawn(test_registry())) }),
74        ];
75
76        // Restart only the terminated child.
77        Supervisor::with_children(children)
78            .strategy(SupervisionStrategy::OneForOne)
79            .start_link(SupervisorOptions::new())
80            .await
81    }
Source

pub async fn lookup<T: Into<Dest>, N: Into<RegistryKey>>( registry: T, key: N, timeout: Option<Duration>, ) -> Result<Option<Pid>, RegistryError>

Looks up a running process.

If the registry is local, this will just query the table without hitting the registry process.

Examples found in repository?
examples/registry.rs (line 31)
22async fn test_registry() {
23    Registry::start_process("space-registry", "my awesome space id", None)
24        .await
25        .expect("Failed to start process");
26
27    Registry::start_process("space-registry", "my lame space id", None)
28        .await
29        .expect("Failed to start process");
30
31    let pid = Registry::lookup("space-registry", "my awesome space id", None)
32        .await
33        .expect("Failed to lookup process");
34
35    tracing::info!("Looked up space process: {:?}", pid);
36
37    let count = Registry::count("space-registry", None)
38        .await
39        .expect("Failed to count processes");
40
41    tracing::info!("Count of registered processes: {:?}", count);
42
43    let list = Registry::list("space-registry", None)
44        .await
45        .expect("Failed to list processes");
46
47    tracing::info!("List of registered processes: {:?}", list);
48}
Source

pub async fn lookup_or_start<T: Into<Dest>, N: Into<RegistryKey>>( registry: T, key: N, timeout: Option<Duration>, ) -> Result<Pid, RegistryError>

Attempts to lookup a running process.

If the process isn’t currently running, it is spawned and passed the key.

Source

pub async fn start_process<T: Into<Dest>, N: Into<RegistryKey>>( registry: T, key: N, timeout: Option<Duration>, ) -> Result<Pid, RegistryError>

Attempts to start a process.

If the process is already running, an error is returned.

Examples found in repository?
examples/registry.rs (line 23)
22async fn test_registry() {
23    Registry::start_process("space-registry", "my awesome space id", None)
24        .await
25        .expect("Failed to start process");
26
27    Registry::start_process("space-registry", "my lame space id", None)
28        .await
29        .expect("Failed to start process");
30
31    let pid = Registry::lookup("space-registry", "my awesome space id", None)
32        .await
33        .expect("Failed to lookup process");
34
35    tracing::info!("Looked up space process: {:?}", pid);
36
37    let count = Registry::count("space-registry", None)
38        .await
39        .expect("Failed to count processes");
40
41    tracing::info!("Count of registered processes: {:?}", count);
42
43    let list = Registry::list("space-registry", None)
44        .await
45        .expect("Failed to list processes");
46
47    tracing::info!("List of registered processes: {:?}", list);
48}
Source

pub async fn stop_process<T: Into<Dest>, N: Into<RegistryKey>>( registry: T, key: N, timeout: Option<Duration>, ) -> Result<(), RegistryError>

Stops a process registered in the given registry with the given key.

If the process is trapping exits, it will still run, but be unregistered from this registry.

If the process is not registered an error is returned.

Source

pub async fn count<T: Into<Dest>>( registry: T, timeout: Option<Duration>, ) -> Result<usize, RegistryError>

Returns the number of registered processes for the given registry.

Examples found in repository?
examples/registry.rs (line 37)
22async fn test_registry() {
23    Registry::start_process("space-registry", "my awesome space id", None)
24        .await
25        .expect("Failed to start process");
26
27    Registry::start_process("space-registry", "my lame space id", None)
28        .await
29        .expect("Failed to start process");
30
31    let pid = Registry::lookup("space-registry", "my awesome space id", None)
32        .await
33        .expect("Failed to lookup process");
34
35    tracing::info!("Looked up space process: {:?}", pid);
36
37    let count = Registry::count("space-registry", None)
38        .await
39        .expect("Failed to count processes");
40
41    tracing::info!("Count of registered processes: {:?}", count);
42
43    let list = Registry::list("space-registry", None)
44        .await
45        .expect("Failed to list processes");
46
47    tracing::info!("List of registered processes: {:?}", list);
48}
Source

pub async fn list<T: Into<Dest>>( registry: T, timeout: Option<Duration>, ) -> Result<Vec<(RegistryKey, Pid)>, RegistryError>

Returns a list of every process registered to the given registry.

There is no ordering guarantee.

Examples found in repository?
examples/registry.rs (line 43)
22async fn test_registry() {
23    Registry::start_process("space-registry", "my awesome space id", None)
24        .await
25        .expect("Failed to start process");
26
27    Registry::start_process("space-registry", "my lame space id", None)
28        .await
29        .expect("Failed to start process");
30
31    let pid = Registry::lookup("space-registry", "my awesome space id", None)
32        .await
33        .expect("Failed to lookup process");
34
35    tracing::info!("Looked up space process: {:?}", pid);
36
37    let count = Registry::count("space-registry", None)
38        .await
39        .expect("Failed to count processes");
40
41    tracing::info!("Count of registered processes: {:?}", count);
42
43    let list = Registry::list("space-registry", None)
44        .await
45        .expect("Failed to list processes");
46
47    tracing::info!("List of registered processes: {:?}", list);
48}
Source

pub async fn remove<T: Into<Dest>, N: Into<RegistryKey>>( registry: T, key: N, timeout: Option<Duration>, ) -> Result<Option<Pid>, RegistryError>

Removes a process registered in the given registry with the given key.

The process will no longer be registered, but it will remain running if it was found.

Source

pub async fn start(self, options: RegistryOptions) -> Result<Pid, ExitReason>

Create a registry proces not linked to a supervision tree.

Creates a registry process as part of a supervision tree.

For example, this function ensures that the registry is linked to the calling process (its supervisor).

Source

pub fn child_spec(self, options: RegistryOptions) -> ChildSpec

Builds a child specification for this Registry process.

Examples found in repository?
examples/registry.rs (line 70)
58    async fn start(&self) -> Result<Pid, ExitReason> {
59        // Spawn a registry that will take care of registering 'MySpace'.
60        let children = [
61            Registry::new("space-registry")
62                .with_start(|key| {
63                    let RegistryKey::String(id) = key else {
64                        panic!()
65                    };
66
67                    MySpace::new(id).start_link(GenServerOptions::new())
68                })
69                .with_shutdown(Shutdown::Infinity)
70                .child_spec(RegistryOptions::new())
71                .id("space-registry"),
72            ChildSpec::new("test-registry")
73                .start(move || async { Ok(Process::spawn(test_registry())) }),
74        ];
75
76        // Restart only the terminated child.
77        Supervisor::with_children(children)
78            .strategy(SupervisionStrategy::OneForOne)
79            .start_link(SupervisorOptions::new())
80            .await
81    }

Trait Implementations§

Source§

impl Clone for Registry

Source§

fn clone(&self) -> Registry

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Drop for Registry

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl GenServer for Registry

Source§

type Message = RegistryMessage

The message type that this server will use.
Source§

async fn init(&mut self) -> Result<(), ExitReason>

Invoked when the server is started. start_link or start will block until it returns.
Source§

async fn terminate(&mut self, _reason: ExitReason)

Invoked when the server is about to exit. It should do any cleanup required. Read more
Source§

async fn handle_cast( &mut self, message: Self::Message, ) -> Result<(), ExitReason>

Invoked to handle asynchronous cast messages.
Source§

async fn handle_call( &mut self, message: Self::Message, _from: From, ) -> Result<Option<Self::Message>, ExitReason>

Invoked to handle synchronous call messages. call will block until a reply is received (unless the call times out or nodes are disconnected). Read more
Source§

async fn handle_info( &mut self, info: Message<Self::Message>, ) -> Result<(), ExitReason>

Invoked to handle all other messages.
Source§

fn start( self, options: GenServerOptions, ) -> impl Future<Output = Result<Pid, ExitReason>> + Send

Starts a GenServer process without links.
Starts a GenServer process linked to the current process.
Source§

fn stop<T: Into<Dest>>( server: T, reason: ExitReason, timeout: Option<Duration>, ) -> impl Future<Output = Result<(), ExitReason>>

Synchronously stops the server with the given reason. Read more
Source§

fn cast<T: Into<Dests>>(servers: T, message: Self::Message)

Casts a request to the servers without waiting for a response. Read more
Source§

fn cast_after<T: Into<Dests>>( servers: T, message: Self::Message, duration: Duration, ) -> Reference

Casts a request to the servers after the given duration without waiting for a response. Read more
Source§

fn call<T: Into<Dest>>( server: T, message: Self::Message, timeout: Option<Duration>, ) -> impl Future<Output = Result<Self::Message, CallError>> + Send

Makes a synchronous call to the server and waits for it’s reply. Read more
Source§

fn reply(from: From, message: Self::Message)

Replies to a client. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more