Requests
While any object can be sent as a user-level message between Actors,
the convention is that instances of ActorRequest are the only kind
of user-level message exchanged.
Class ActorRequest
An ActorRequest (a “request”) is a triple of a Message destined
for a remote behavior (the “message”), a Process interested in the
reply (the “sender”), and a Promise by which the reply is to be
delivered to the Process (the “promise”).
The sender is not always an ActorProcess. An ordinary Process can
send ActorRequests and can wait for eventual replies or exceptions.
A request is not intrinsically targeted at any actor in particular; it does not store any information about the identity of its target.
Asynchronous requests
If the promise is nil, the request is asynchronous and no-one cares
about the reply to the eventual evaluation of the message. However,
even in this case, the sender is almost always non-nil: an
asynchronous request can still usefully have a notion of “sender”
associated with it.
Sending requests
Requests can be sent to an actor with ActorRequest >> #sendTo: or
the #redirectTo: family of methods. There are also convenience
methods Actor class >> #sendRequest:to: and sendAsyncRequest:to:,
and of course any instance of ActorProxy builds and sends
ActorRequest instances.
Once a request has been sent, its reply may be retrieved via the
Promise it holds.
Sending replies or notifying of failures
Ultimately, when a response is ready for a request, it is transmitted
by invoking ActorRequest >> #resolveWith: or #rejectWith:, as
appropriate. Compare these to similar and similarly-named methods on
Promise.
In order to ensure that every request receives an answer, a request
sometimes stores the identity of an Actor (in its worker instance
variable) that has taken responsibility for the request, so that it
can send a default answer if no-one else supplies anything first. The
request object takes care to signal the worker whenever someone
supplies a reply to it, so that the worker knows it no longer needs
to bother with the request.