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 ofSessionwhich 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 ofSingleTaskSessionorMultiTaskSession.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static classAbstractSession.CloseReasonThe reason that a particular session closed.
-
Field Summary
Fields Modifier and Type Field Description protected Set<String>aliasesUsedBySessionprotected AtomicReference<AbstractSession.CloseReason>closeReasonprotected GraphManagergraphManagerprotected booleanmaintainStateAfterExceptionprotected ConcurrentMap<String,Session>sessionsprotected AtomicBooleansessionTaskStartedprotected ThreadsessionThreadThe 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 Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected voidcancel(boolean mayInterruptIfRunning)voidclose()Removes the session from the session list and cancels the future that manages the lifetime of the session.protected voidcloseTransaction(SessionTask sessionTask, Transaction.Status status)Closes a transaction with commit or rollback.protected voidcloseTransaction(Transaction.Status status)Close the transaction without aSessionTaskwhich suppliesnullto that argument forcloseTransaction(SessionTask, Transaction.Status).protected voidcloseTransactionSafely(SessionTask sessionTask, Transaction.Status status)Tries to close the transaction but will catch exceptions and log them.protected voidcloseTransactionSafely(Transaction.Status status)Tries to close the transaction but will catch exceptions and log them.protected static Optional<Throwable>determineIfSpecialException(Throwable ex)Check if any exception in the chain isTemporaryExceptionorFailurethen 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 anIteratorfrom 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.longgetActualTimeoutLengthWhenClosed()Optional<AbstractSession.CloseReason>getCloseReason()GremlinScriptEnginegetScriptEngine(SessionTask sessionTask, String language)Gets the script engine from the cached one in theGremlinExecutor.StringgetSessionId()Gets the identifier for the session.protected BindingsgetWorkerBindings()protected voidhandleException(SessionTask sessionTask, Throwable t)protected voidhandleGraphOperation(SessionTask sessionTask, Bytecode bytecode, Graph graph)protected voidhandleIterator(SessionTask sessionTask, Iterator<?> itty)Provides a generic way of iterating a result set back to the client.booleanisBoundTo(io.netty.channel.Channel channel)Determines if the suppliedChannelobject is the same as the one bound to theSession.booleanisTransactionManaged()protected voiditerateComplete(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 FramemakeFrame(SessionTask sessionTask, List<Object> aggregate, ResponseStatusCode code, Iterator<?> itty)protected BindingsmergeBindingsFromRequest(SessionTask sessionTask, Bindings bindings)protected voidprocess(SessionTask sessionTask)protected abstract voidsendTimeoutResponseForUncommencedTask()Respond to the client with the specific timeout response for this Session implementation.voidsetSessionCancelFuture(ScheduledFuture<?> f)Sets a reference to the job that will cancel this session if it exceeds its timeout period.voidsetSessionFuture(Future<?> f)Sets a reference to the job itself that is running this session.protected voidstartTransaction(SessionTask sessionTask)Called right before a transaction starts withinRunnable.run().voidtriggerTimeout(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:SessionGets the identifier for the session.- Specified by:
getSessionIdin interfaceSession
-
isBoundTo
public boolean isBoundTo(io.netty.channel.Channel channel)
Description copied from interface:SessionDetermines if the suppliedChannelobject 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:SessionSets a reference to the job that will cancel this session if it exceeds its timeout period.- Specified by:
setSessionCancelFuturein interfaceSession
-
setSessionFuture
public void setSessionFuture(Future<?> f)
Description copied from interface:SessionSets a reference to the job itself that is running this session.- Specified by:
setSessionFuturein interfaceSession
-
triggerTimeout
public void triggerTimeout(long timeout, boolean causedBySession)Description copied from interface:SessionProvides a general way to interrupt the session by way of a timeout.- Specified by:
triggerTimeoutin 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.falseor 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
-
determineIfSpecialException
protected static Optional<Throwable> determineIfSpecialException(Throwable ex)
Check if any exception in the chain isTemporaryExceptionorFailurethen 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:
closein interfaceAutoCloseable
-
fromScript
protected Iterator<?> fromScript(SessionTask sessionTask, String script) throws Exception
Constructs anIteratorfrom the results of a script evaluation provided in theSessionTask.- Parameters:
sessionTask- The session task which can be used as a context in constructing theIteratorscript- The script extracted by the calling method from thesessionTask- Throws:
Exception
-
fromBytecode
protected Optional<Iterator<?>> fromBytecode(SessionTask sessionTask, Bytecode bytecode) throws Exception
Constructs anIteratorfromBytecodeprovided in theSessionTask. If theBytecodeis found to evalute to aGraphOpthen it is processed and an emptyOptionalis 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 ServerSessionTaskobject 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 currentIteratorof 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 currentIteratorof 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 aSessionTaskwhich suppliesnullto 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.strictTransactionManagementand when aliases are present on the request in the currentSessionTask. If the suppliedSessionTaskisnullthen "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.
-
-