Class AbstractSession
- java.lang.Object
-
- org.apache.tinkerpop.gremlin.server.handler.AbstractSession
-
- All Implemented Interfaces:
AutoCloseable
,Runnable
,Session
- Direct Known Subclasses:
MultiTaskSession
,SingleTaskSession
public abstract class AbstractSession extends Object implements Session, AutoCloseable
A base implementation ofSession
which offers some common functionality that matches typical Gremlin Server request response expectations for script, bytecode and graph operations. The class is designed to be extended but take care in understanding the way that different methods are called as they do depend on one another a bit. It maybe best to examine the source code to determine how best to use this class or to extend from the higher order classes ofSingleTaskSession
orMultiTaskSession
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static class
AbstractSession.CloseReason
The reason that a particular session closed.
-
Field Summary
Fields Modifier and Type Field Description protected Set<String>
aliasesUsedBySession
protected AtomicReference<AbstractSession.CloseReason>
closeReason
protected GraphManager
graphManager
protected boolean
maintainStateAfterException
protected ConcurrentMap<String,Session>
sessions
protected AtomicBoolean
sessionTaskStarted
protected Thread
sessionThread
The session thread is a reference to the thread that is running the session and should be set by an implementation as the first line of theRunnable.run()
method.-
Fields inherited from interface org.apache.tinkerpop.gremlin.server.handler.Session
evalOpTimer, traversalOpTimer
-
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected void
cancel(boolean mayInterruptIfRunning)
void
close()
Removes the session from the session list and cancels the future that manages the lifetime of the session.protected void
closeTransaction(SessionTask sessionTask, Transaction.Status status)
Closes a transaction with commit or rollback.protected void
closeTransaction(Transaction.Status status)
Close the transaction without aSessionTask
which suppliesnull
to that argument forcloseTransaction(SessionTask, Transaction.Status)
.protected void
closeTransactionSafely(SessionTask sessionTask, Transaction.Status status)
Tries to close the transaction but will catch exceptions and log them.protected void
closeTransactionSafely(Transaction.Status status)
Tries to close the transaction but will catch exceptions and log them.protected Optional<Throwable>
determineIfTemporaryException(Throwable ex)
Check if any exception in the chain is TemporaryException then we should respond with the right error code so that the client knows to retry.protected Optional<Iterator<?>>
fromBytecode(SessionTask sessionTask, Bytecode bytecode)
protected Iterator<?>
fromScript(SessionTask sessionTask, String script)
Constructs anIterator
from the results of a script evaluation provided in theSessionTask
.protected Map<String,Object>
generateResponseMetaData(SessionTask sessionTask, ResponseStatusCode code, Iterator<?> itty)
Generates response result meta-data to put on aResponseMessage
.protected Map<String,Object>
generateStatusAttributes(SessionTask sessionTask, ResponseStatusCode code, Iterator<?> itty)
Generates response status meta-data to put on aResponseMessage
.long
getActualTimeoutLengthWhenClosed()
Optional<AbstractSession.CloseReason>
getCloseReason()
GremlinScriptEngine
getScriptEngine(SessionTask sessionTask, String language)
Gets the script engine from the cached one in theGremlinExecutor
.String
getSessionId()
Gets the identifier for the session.protected Bindings
getWorkerBindings()
protected void
handleException(SessionTask sessionTask, Throwable t)
protected void
handleGraphOperation(SessionTask sessionTask, Bytecode bytecode, Graph graph)
protected void
handleIterator(SessionTask sessionTask, Iterator<?> itty)
Provides a generic way of iterating a result set back to the client.boolean
isBoundTo(io.netty.channel.Channel channel)
Determines if the suppliedChannel
object is the same as the one bound to theSession
.boolean
isTransactionManaged()
protected void
iterateComplete(SessionTask sessionTask, Iterator<?> itty)
Called when iteration withinhandleIterator(SessionTask, Iterator)
is on its final pass and the final frame is about to be sent back to the client.protected Frame
makeFrame(SessionTask sessionTask, List<Object> aggregate, ResponseStatusCode code, Iterator<?> itty)
protected Bindings
mergeBindingsFromRequest(SessionTask sessionTask, Bindings bindings)
protected void
process(SessionTask sessionTask)
protected abstract void
sendTimeoutResponseForUncommencedTask()
Respond to the client with the specific timeout response for this Session implementation.void
setSessionCancelFuture(ScheduledFuture<?> f)
Sets a reference to the job that will cancel this session if it exceeds its timeout period.void
setSessionFuture(Future<?> f)
Sets a reference to the job itself that is running this session.protected void
startTransaction(SessionTask sessionTask)
Called right before a transaction starts withinRunnable.run()
.void
triggerTimeout(long timeout, boolean causedBySession)
Provides a general way to interrupt the session by way of a timeout.-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.tinkerpop.gremlin.server.handler.Session
isAcceptingTasks, submitTask
-
-
-
-
Field Detail
-
sessionThread
protected Thread sessionThread
The session thread is a reference to the thread that is running the session and should be set by an implementation as the first line of theRunnable.run()
method.
-
maintainStateAfterException
protected final boolean maintainStateAfterException
-
closeReason
protected final AtomicReference<AbstractSession.CloseReason> closeReason
-
graphManager
protected final GraphManager graphManager
-
sessions
protected final ConcurrentMap<String,Session> sessions
-
sessionTaskStarted
protected final AtomicBoolean sessionTaskStarted
-
-
Method Detail
-
cancel
protected void cancel(boolean mayInterruptIfRunning)
-
isTransactionManaged
public boolean isTransactionManaged()
-
getSessionId
public String getSessionId()
Description copied from interface:Session
Gets the identifier for the session.- Specified by:
getSessionId
in interfaceSession
-
isBoundTo
public boolean isBoundTo(io.netty.channel.Channel channel)
Description copied from interface:Session
Determines if the suppliedChannel
object is the same as the one bound to theSession
.
-
getActualTimeoutLengthWhenClosed
public long getActualTimeoutLengthWhenClosed()
-
getCloseReason
public Optional<AbstractSession.CloseReason> getCloseReason()
-
getScriptEngine
public GremlinScriptEngine getScriptEngine(SessionTask sessionTask, String language)
Gets the script engine from the cached one in theGremlinExecutor
.
-
sendTimeoutResponseForUncommencedTask
protected abstract void sendTimeoutResponseForUncommencedTask()
Respond to the client with the specific timeout response for this Session implementation. This is for situations where the Session hasn't started running.
-
setSessionCancelFuture
public void setSessionCancelFuture(ScheduledFuture<?> f)
Description copied from interface:Session
Sets a reference to the job that will cancel this session if it exceeds its timeout period.- Specified by:
setSessionCancelFuture
in interfaceSession
-
setSessionFuture
public void setSessionFuture(Future<?> f)
Description copied from interface:Session
Sets a reference to the job itself that is running this session.- Specified by:
setSessionFuture
in interfaceSession
-
triggerTimeout
public void triggerTimeout(long timeout, boolean causedBySession)
Description copied from interface:Session
Provides a general way to interrupt the session by way of a timeout.- Specified by:
triggerTimeout
in interfaceSession
- Parameters:
timeout
- the length of time that passed for the timeout to have triggeredcausedBySession
- determines if the timeout triggered due to a particular request (i.e.false
or because of the session lifetime (i.e.true
-
process
protected void process(SessionTask sessionTask) throws SessionException
- Throws:
SessionException
-
handleException
protected void handleException(SessionTask sessionTask, Throwable t) throws SessionException
- Throws:
SessionException
-
determineIfTemporaryException
protected Optional<Throwable> determineIfTemporaryException(Throwable ex)
Check if any exception in the chain is TemporaryException then we should respond with the right error code so that the client knows to retry.
-
close
public void close()
Removes the session from the session list and cancels the future that manages the lifetime of the session.- Specified by:
close
in interfaceAutoCloseable
-
fromScript
protected Iterator<?> fromScript(SessionTask sessionTask, String script) throws Exception
Constructs anIterator
from the results of a script evaluation provided in theSessionTask
.- Parameters:
sessionTask
- The session task which can be used as a context in constructing theIterator
script
- The script extracted by the calling method from thesessionTask
- Throws:
Exception
-
fromBytecode
protected Optional<Iterator<?>> fromBytecode(SessionTask sessionTask, Bytecode bytecode) throws Exception
Constructs anIterator
fromBytecode
provided in theSessionTask
. If theBytecode
is found to evalute to aGraphOp
then it is processed and an emptyOptional
is returned.
-
getWorkerBindings
protected Bindings getWorkerBindings() throws SessionException
- Throws:
SessionException
-
mergeBindingsFromRequest
protected Bindings mergeBindingsFromRequest(SessionTask sessionTask, Bindings bindings) throws SessionException
- Throws:
SessionException
-
handleIterator
protected void handleIterator(SessionTask sessionTask, Iterator<?> itty) throws InterruptedException
Provides a generic way of iterating a result set back to the client.- Parameters:
sessionTask
- The Gremlin ServerSessionTask
object containing settings, request message, etc.itty
- The result to iterator- Throws:
InterruptedException
-
handleGraphOperation
protected void handleGraphOperation(SessionTask sessionTask, Bytecode bytecode, Graph graph) throws Exception
- Throws:
Exception
-
iterateComplete
protected void iterateComplete(SessionTask sessionTask, Iterator<?> itty)
Called when iteration withinhandleIterator(SessionTask, Iterator)
is on its final pass and the final frame is about to be sent back to the client. This method only gets called on successful iteration of the entire result.
-
generateStatusAttributes
protected Map<String,Object> generateStatusAttributes(SessionTask sessionTask, ResponseStatusCode code, Iterator<?> itty)
Generates response status meta-data to put on aResponseMessage
.- Parameters:
itty
- a reference to the currentIterator
of results - it is not meant to be forwarded in this method
-
generateResponseMetaData
protected Map<String,Object> generateResponseMetaData(SessionTask sessionTask, ResponseStatusCode code, Iterator<?> itty)
Generates response result meta-data to put on aResponseMessage
.- Parameters:
itty
- a reference to the currentIterator
of results - it is not meant to be forwarded in this method
-
makeFrame
protected Frame makeFrame(SessionTask sessionTask, List<Object> aggregate, ResponseStatusCode code, Iterator<?> itty) throws Exception
- Throws:
Exception
-
startTransaction
protected void startTransaction(SessionTask sessionTask)
Called right before a transaction starts withinRunnable.run()
. The default implementation checks for open transactions and throws an exception if it finds any and generally assumes auto-transactions are enabled on graphs (i.e. transaction automatically start on read/write). Providers who do not follow these sorts of transaction semantics should provide an override to this method.
-
closeTransaction
protected void closeTransaction(Transaction.Status status)
Close the transaction without aSessionTask
which suppliesnull
to that argument forcloseTransaction(SessionTask, Transaction.Status)
. This method is idempotent.
-
closeTransactionSafely
protected void closeTransactionSafely(Transaction.Status status)
Tries to close the transaction but will catch exceptions and log them. This method is idempotent.
-
closeTransactionSafely
protected void closeTransactionSafely(SessionTask sessionTask, Transaction.Status status)
Tries to close the transaction but will catch exceptions and log them. This method is idempotent.
-
closeTransaction
protected void closeTransaction(SessionTask sessionTask, Transaction.Status status)
Closes a transaction with commit or rollback. Strict transaction management settings are observed when configured as such inSettings.strictTransactionManagement
and when aliases are present on the request in the currentSessionTask
. If the suppliedSessionTask
isnull
then "strict" is bypassed so this form must be called with care. Bypassing is often useful to ensure that all transactions are cleaned up when multiple graphs are referenced. Prefer callingcloseTransaction(Transaction.Status)
in this case instead. This method is idempotent.
-
-