Class OortService<R,C>
- Type Parameters:
R
- the result typeC
- the opaque context type
- All Implemented Interfaces:
EventListener
,Bayeux.BayeuxListener
,ConfigurableServerChannel.ServerChannelListener
,ServerChannel.MessageListener
,org.eclipse.jetty.util.component.LifeCycle
- Direct Known Subclasses:
OortMasterService
public abstract class OortService<R,C> extends org.eclipse.jetty.util.component.AbstractLifeCycle implements ServerChannel.MessageListener
An OortService
allows applications to forward actions to Oort
nodes that own the entity onto which the action should be applied.
An OortService
builds on the concept introduced by OortObject
that the ownership of a particular entity belongs only to one node.
Any node can read the entity, but only the owner can create/modify/delete it.
In order to perform actions that modify the entity, a node has to know what is the node that owns the entity, and then forward the action to the owner node.
OortService
provides the facilities to forward the action to the
owner node and return the result of the action, or its failure.
OortService
s are usually created at application startup, but may
be created and destroyed on-the-fly.
In both cases, they must be started
to make them functional
and stopped
when they are no longer needed.
Usage of OortService
follows these steps:
-
The application running in the requesting node identifies
the owner node and calls
forward(String, Object, Object)
, passing the Oort URL of the owner node, the action data, and an opaque context -
The application implements
onForward(Request)
, which is executed in the owner node. In this method the action data is used to perform the action that modifies the entity, and the result is returned (or an exception thrown in case of failure). -
The application implements
onForwardSucceeded(Object, Object)
(which is executed in the requesting node) which provides as parameters the result of the action from the second step and the opaque context from the first step. -
The application implements
onForwardFailed(Object, Object)
(which is executed in the requesting node) which provides as parameters the failure from the second step and the opaque context from the first step. The failure object is the message string of a generic exception, or the failure returned byOortService.Result.failure(Object)
.
The steps above do not change if the requesting node and the owner node are the same.
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
OortService.Request
Encapsulates a forwarded request.static class
OortService.Result<U>
Encapsulates the result of a forwarded request returned byonForward(Request)
.static class
OortService.ServerContext
Utility context that stores theServerSession
and theServerMessage
.Nested classes/interfaces inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener
Nested classes/interfaces inherited from interface org.cometd.bayeux.server.ConfigurableServerChannel.ServerChannelListener
ConfigurableServerChannel.ServerChannelListener.Weak
-
Field Summary
Fields Modifier and Type Field Description protected org.slf4j.Logger
logger
-
Constructor Summary
Constructors Modifier Constructor Description protected
OortService(Oort oort, String name)
Creates anOortService
with the given name. -
Method Summary
Modifier and Type Method Description protected void
doStart()
protected void
doStop()
protected boolean
forward(String targetOortURL, Object parameter, C context)
Subclasses must call this method to forward the action to the owner node.LocalSession
getLocalSession()
String
getName()
Oort
getOort()
long
getTimeout()
protected abstract OortService.Result<R>
onForward(OortService.Request request)
Subclasses must implement this method, that runs on the owner node, to implement the action functionality.protected abstract void
onForwardFailed(Object failure, C context)
Subclasses must implement this method, that runs on the requesting node, to complete the functionality after the action failed on the owner node.protected void
onForwardMessage(Map<String,Object> data, boolean broadcast)
protected abstract void
onForwardSucceeded(R result, C context)
Subclasses must implement this method, that runs on the requesting node, to complete the functionality after the action has been successfully run on the owner node.boolean
onMessage(ServerSession from, ServerChannel channel, ServerMessage.Mutable message)
Callback invoked when a message is being published.protected void
onResultMessage(Map<String,Object> data)
void
setTimeout(long timeout)
String
toString()
-
Field Details
-
logger
protected final org.slf4j.Logger logger
-
-
Constructor Details
-
OortService
Creates anOortService
with the given name.- Parameters:
oort
- the Oort where this service livesname
- the unique name across the cluster of this service
-
-
Method Details
-
getOort
- Returns:
- the Oort of this service
-
getName
- Returns:
- the name of this service
-
getLocalSession
- Returns:
- the local session associated with this service
-
getTimeout
public long getTimeout()- Returns:
- the timeout, in milliseconds, for an action to return a result (by default 5000 ms)
-
setTimeout
public void setTimeout(long timeout)- Parameters:
timeout
- the timeout, in milliseconds, for an action to return a result
-
doStart
- Overrides:
doStart
in classorg.eclipse.jetty.util.component.AbstractLifeCycle
- Throws:
Exception
-
doStop
- Overrides:
doStop
in classorg.eclipse.jetty.util.component.AbstractLifeCycle
- Throws:
Exception
-
forward
Subclasses must call this method to forward the action to the owner node.
If the
targetOortURL
isnull
, then the action is broadcast to all nodes. Nodes that receive an action request that they can't fullfill because they don't own the entity the action should be applied to must returnOortService.Result.ignore(Object)
.- Parameters:
targetOortURL
- the owner node Oort URL, or null to broadcast the action to all nodesparameter
- the action parameter that will be passed toonForward(Request)
context
- the opaque context passed toonForwardSucceeded(Object, Object)
- Returns:
- whether the forward succeeded
-
onMessage
Description copied from interface:ServerChannel.MessageListener
Callback invoked when a message is being published.
Implementers can decide to return false to signal that the message should not be published.
- Specified by:
onMessage
in interfaceServerChannel.MessageListener
- Parameters:
from
- the session that publishes the messagechannel
- the channel the message is published tomessage
- the message to be published- Returns:
- whether the message should be published or not
-
onForwardMessage
-
onResultMessage
-
onForward
Subclasses must implement this method, that runs on the owner node, to implement the action functionality.
The result to return is
OortService.Result.success(Object)
orOortService.Result.failure(Object)
if the implementation of this method was able to find the entity on which the action functionality was meant to be applied, orOortService.Result.ignore(Object)
if the entity was not found.- Parameters:
request
- the request containing the parameter passed fromforward(String, Object, Object)
- Returns:
- the result containing the data that will be passed to
onForwardSucceeded(Object, Object)
-
onForwardSucceeded
Subclasses must implement this method, that runs on the requesting node, to complete the functionality after the action has been successfully run on the owner node.- Parameters:
result
- the result of the actioncontext
- the opaque context fromforward(String, Object, Object)
-
onForwardFailed
Subclasses must implement this method, that runs on the requesting node, to complete the functionality after the action failed on the owner node.- Parameters:
failure
- the failure of the actioncontext
- the opaque context fromforward(String, Object, Object)
-
toString
-