trait ServiceBindings extends ServiceActor
Declarative mapping from a service domain's protocol to implementations. Included in ServiceFragment.
In glngn server, the mapping of service domain protocol to implementations is refered to as the
bindings: the binding of a domain term to an implementation. Logically similar to data binding in
UI controller libraries. The bindings are determined by evaluating Instance.bindings
for each
service actor instance.
See Bindings for the EDSL for declaring bindings.
The ServiceBindings
trait enforces this by requiring the ServiceActor
object to define an
Instance
class implementing BindingsInstance
. The ServiceFragment's Instance
already
satisfies this requirement.
object BalanceSheet extends ServiceActor with ServiceBindings { sealed trait Proto extends Message case class PrintAndMailBalance(accountId: Int) extends Proto with Command[Unit] case class PostBalanceToMessageBus(accountId: Int) extends Proto with Command[Balance] class Instance(val env: InstanceEnv) extends BindingsInstance { import Bindings._ val behavior: Behavior[Envelope] = Behaviors.receiveMessagePartial { case Request(scope, PostBalanceToMessageBus(accountId)) => { val balance = getBalanceNonIO(accountId) postBalanceToMessageBus(balance) scope.provide(balance) Behaviors.same } } // chain sequences individual Bindings[_]. def bindings: Bindings[_] = chain( // a Bindings[_] constructor from object Bindings // this performs the given IO on protocol match. responderIO { case PrintAndMailBalance(accountId) => requestBalanceSheet(accountId) >>= printInMailroom }, // a Bindings[_] constructor from object Bindings // this delegates to an akka typed Behavior[Envelope] delegate(behavior) ) } }
- Grouped
- Alphabetic
- By Inheritance
- ServiceBindings
- ServiceActor
- DirectLogging
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
-
abstract
class
Command[Response] extends Request[Response] with proto.ProtoDecl.Command with proto.ProtoDecl.Request
All commands are Requests with Proto:
extends Command[R] with Proto
.All commands are Requests with Proto:
extends Command[R] with Proto
.sealed trait Proto extends Message case class ExampleCommand(msg: String) extends Command[ExampleResponse] with Proto
- Definition Classes
- ServiceActor
-
sealed
trait
Envelope extends Product with Message with Serializable
A Proto event with additional attributes and claims.
A Proto event with additional attributes and claims. To pattern match on an Envelope use the Event.unapply or Request.unapply extractors.
val behavior: Behavior[Envelope] = Behaviors.receiveMessagePartial { case Event(SomeEvent(eventData)) => ??? case Request(scope, SomeCommand(eventData)) => ??? }
An Envelope can be implicitly constructed from any Proto.
val delegate: ActorRef[Envelope] = ??? val anEvent: Proto = SomeEvent(eventData) delegate ! anEvent
- Definition Classes
- ServiceActor
-
abstract
class
Query[Response] extends Request[Response] with proto.ProtoDecl.Query with proto.ProtoDecl.Request
All queries are Requests with Proto:
extends Query[R] with Proto
.All queries are Requests with Proto:
extends Query[R] with Proto
.sealed trait Proto extends Message case class ExampleQuery(msg: String) extends Query[ExampleResponse] with Proto
- Definition Classes
- ServiceActor
-
sealed abstract
class
Request[R] extends AnyRef
A protocol event can be declared as a Request using Command or Query.
A protocol event can be declared as a Request using Command or Query. The type parameter is the response that resolves the request.
sealed trait Proto extends Message case class ExampleCommand(msg: String) extends Command[ExampleResponse] with Proto case class ExampleQuery(msg: String) extends Query[ExampleResponse] with Proto
- Definition Classes
- ServiceActor
-
final
type
AnyRequest = Proto with Request[_]
AnyRequest is a Command or Query with no particular response type.
- Definition Classes
- ServiceActor
-
final
type
Bindings[A] = FreeApplicative[BindingsOp, A]
Type of bindings declaration.
- trait BindingsInstance extends AnyRef
-
final
type
Delegate = ActorRef[Envelope]
The delegate is an actor accepting events in Envelope messages.
- implicit class DelegateOps extends AnyRef
-
abstract
type
Instance <: BindingsInstance
This service actor object must contain a class
Instance
.This service actor object must contain a class
Instance
. This class must mix in, at least, BindingsInstance. Which contains thebindings
value.The requirement on an
Instance
assists in parameterization of service actor behavior while keeping consideration of the Protocol separate.See ServiceFragment for high level API.
-
abstract
type
InstanceEnv <: BindingsInstanceEnv
Environment for instance of service actor using bindings.
Environment for instance of service actor using bindings. This is data an
Instance
will always be provided. -
abstract
type
Proto <: Message
The commands, queries and events all implement Proto.
The commands, queries and events all implement Proto. Easy inferrence of operations schema and endpoint schema assumes the use of a sealed trait.
- Definition Classes
- ServiceActor
a typical definition
sealed trait Proto extends Message
, an event type
AnEvent
inProto
sealed trait Proto extends Message case class AnEvent(msg: String) extends Proto
Examples:
Value Members
-
object
Envelope extends Serializable
- Definition Classes
- ServiceActor
-
object
Event
Any statement in the protocol can be considered an Event not associated with any additional scope.
Any statement in the protocol can be considered an Event not associated with any additional scope.
- see also ServiceActor.RequestScope and Request.unapply
- Definition Classes
- ServiceActor
-
object
Request
- Definition Classes
- ServiceActor
-
object
StopEnvelope extends Envelope with Product with Serializable
- Definition Classes
- ServiceActor
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
lazy val
logger: prelude.external.Logger
- Attributes
- protected
- Definition Classes
- DirectLogging
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
object
Bindings
Methods to bind this service's protocol to implementations.
Methods to bind this service's protocol to implementations.
If a binding is not provided for a protocol message the message is considered unhandled. Any endpoint for the protocol message will reply with HTTP 501 Not Implemented.
// a hypothetical service for account balances final object AServiceFragment extends ServiceFragment { override def instantiate(env: InstanceEnv) = new Instance(env) { // the service event consumer is implemented using... val bindings = bindingsChain( // operations on a named entity entity(AnEntity) { case ServiceOperationOnEntity(entityId) => AnEntity.AnOperation -> accountId }, // a daemon sending Proto messages back to this service async(OrdersOverSMSBehavior) // where OrdersOverSMSBehavior being a [[ServiceActorDaemon]] ) } }
glngn server is a low-code business process as a service rapid development system. Conceptually similar to a programmable Microsoft Access or Apple FileMaker for scalable event sourced business services. In addition to a library, a standalone application is provided that is useful with minimal ceremony. This can be customized with a simple API. As well as deployed to a kubernetes cluster should those advantages be required.
A deployment is cluster of glngn.server.node.AppNodes serving a dynamic composition of glngn.server.ServiceFragments. Deployments are designed to be fully usable as a standalone local application or a kubernetes service.
Contact support@dogheadbone.com for support and licensing.