Skip to main content

ActorRef

Struct ActorRef 

Source
pub struct ActorRef<M>
where M: MessageBounds,
{ /* private fields */ }
Expand description

A reference to an actor with type Message = M;

Use tell to send messages to the referenced actor.

This kind of actor reference is similar to a Weak in that it doesn’t prevent deallocation of the referenced actor. If deallocation must be prevented for some reason, consider upgrading this to an ActorRefStrong using hold. Note that a component can still enter the destroyed (or other non-active) state, while a strong reference is held. Holding a strong reference only prevent memory deallocation, but does not guarantee messag handling.

Upgrading this to an ActorRefStrong also improves performance somewhat, and is recommended when using the same actor reference over and over again in a loop, for example.

Implementations§

Source§

impl<M> ActorRef<M>
where M: MessageBounds,

Source

pub fn enqueue(&self, env: MsgEnvelope<M>)

Enqueue a fully prepared message envelope directly into the actor mailbox.

This bypasses the Into<M> conversion used by tell and is primarily intended for advanced integrations that already operate on MsgEnvelope values.

Source

pub fn hold(&self) -> Option<ActorRefStrong<M>>

Upgrade this reference to a strong reference

This is only possible if the target actor has not already been deallocated. If it has, None will be returned.

Source

pub fn tell<I>(&self, v: I)
where I: Into<M>,

Send message v to the actor instance referenced by this actor reference

Source

pub fn ask_with<R, F>(&self, f: F) -> KFuture<R>
where R: Send, F: FnOnce(KPromise<R>) -> M,

Helper to create messages that expect a response via a future instead of a message

§Example
use kompact::prelude::*;
use std::time::Duration;

#[derive(ComponentDefinition)]
struct AskComponent {
    ctx: ComponentContext<Self>
}



impl Actor for AskComponent {
    type Message = Ask<u64, String>;

    fn receive_local(&mut self, msg: Self::Message) -> HandlerResult {
        msg.complete(|num| {
            format!("{}", num)
        })
        .expect("completion");
        Handled::OK
    }

}

let system = KompactConfig::default().build().wait().expect("system");
let c = system.create(AskComponent::new);
let actor_ref = c.actor_ref();

let start_f = system.start_notify(&c);
start_f
    .wait_timeout(Duration::from_millis(1000))
    .expect("component start");

let response_f = actor_ref.ask_with(Ask::of(42u64));
let response = response_f
    .wait_timeout(Duration::from_millis(1000))
    .expect("response");
assert_eq!("42".to_string(), response);
Source

pub fn recipient<T>(&self) -> Recipient<T>
where T: Into<M> + Debug + 'static,

Returns a version of this actor ref that can only be used to send T, which is then auto-wrapped into M

Use this expose a narrower interface to another actor.

§Note

The indirection provided by Recipient has some performance impact. Use benchmarking to establish whether or not the better encapsulation is worth the performance loss in your scenario.

Source

pub fn recipient_with<T>(&self, convert: fn(T) -> M) -> Recipient<T>
where T: Debug + 'static,

Returns a version of this actor ref that can only be used to send T, which is then auto-wrapped into M using convert

Use this expose a narrower interface to another actor.

§Note

The indirection provided by Recipient has some performance impact. Use benchmarking to establish whether or not the better encapsulation is worth the performance loss in your scenario.

Source§

impl<Request, Response> ActorRef<Ask<Request, Response>>
where Request: MessageBounds, Response: Send + Debug + 'static,

Source

pub fn ask(&self, request: Request) -> KFuture<Response>

Helper to create messages that expect a response via a future instead of a message

§Example
use kompact::prelude::*;
use std::time::Duration;

#[derive(ComponentDefinition)]
struct AskComponent {
    ctx: ComponentContext<Self>
}



impl Actor for AskComponent {
    type Message = Ask<u64, String>;

    fn receive_local(&mut self, msg: Self::Message) -> HandlerResult {
        msg.complete(|num| {
            format!("{}", num)
        })
        .expect("completion");
        Handled::OK
    }

}

let system = KompactConfig::default().build().wait().expect("system");
let c = system.create(AskComponent::new);
let actor_ref = c.actor_ref();

let start_f = system.start_notify(&c);
start_f
    .wait_timeout(Duration::from_millis(1000))
    .expect("component start");

let response_f = actor_ref.ask(42u64);
let response = response_f
    .wait_timeout(Duration::from_millis(1000))
    .expect("response");
assert_eq!("42".to_string(), response);

Trait Implementations§

Source§

impl<M> ActorRefFactory for ActorRef<M>
where M: MessageBounds,

Source§

type Message = M

The type of messages carried by references produced by this factory
Source§

fn actor_ref(&self) -> ActorRef<M>

Returns the associated actor reference
Source§

impl<M> Clone for ActorRef<M>
where M: MessageBounds,

Source§

fn clone(&self) -> ActorRef<M>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<M> Debug for ActorRef<M>
where M: MessageBounds,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<M> Display for ActorRef<M>
where M: MessageBounds,

Source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<M> DynActorRefFactory for ActorRef<M>
where M: MessageBounds,

Available on crate feature distributed only.
Source§

fn dyn_ref(&self) -> DynActorRef

Returns a version of an actor ref that can only be used for network messages, but not for typed messages.
Source§

impl<M> PartialEq for ActorRef<M>
where M: MessageBounds,

Source§

fn eq(&self, other: &ActorRef<M>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.

Auto Trait Implementations§

§

impl<M> Freeze for ActorRef<M>

§

impl<M> !RefUnwindSafe for ActorRef<M>

§

impl<M> Send for ActorRef<M>

§

impl<M> Sync for ActorRef<M>

§

impl<M> Unpin for ActorRef<M>

§

impl<M> UnsafeUnpin for ActorRef<M>

§

impl<M> !UnwindSafe for ActorRef<M>

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> DispatchEvent for T
where T: Any + Send + Debug,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any + Send>

Convert this event into an erased Any payload for downcasting.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<M, T, A> Receiver<T> for A
where T: Debug + 'static, M: From<T> + MessageBounds, A: ActorRefFactory<Message = M>,

Source§

fn recipient(&self) -> Recipient<T>

Produce a recipient for T
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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

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

Source§

fn try_clone(&self) -> Result<T, SerError>

Tries to produce a copy of self or returns an error
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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> Erased for T

Source§

impl<M> MessageBounds for M
where M: Debug + Send + 'static,