Class SessionTransMgr

java.lang.Object
com.iizix.comm.session.SessionTransMgr
All Implemented Interfaces:
GCloseCodes, GManagementConstants, ITransactionCreator, ISessionStatistics, ISessionTransMgr, TransactionCommListener, GConstants

The Session Transaction Manager is used for keeping track of transaction that have been received or sent to a client on session basis so that a remote session may re-establish a broken communication link.
Author:
Christopher Mindus
  • Field Details

    • MAX_UNANSWERED_HEARTBEATS

      public static final int MAX_UNANSWERED_HEARTBEATS
      The heartbeats in a row that may go without any inbound frame before the link is cut, 3.

      A peer that no longer answers is not noticed while the server's PINGs are written: behind a reverse proxy the TCP peer is the proxy, which acknowledges everything, and a suspended phone's kernel may acknowledge too, so TCP reports nothing and the session looks connected for as long as the dormant time-out. Any inbound frame - a PONG, a data frame - proves the peer reads and resets the count (onCommHeartBeat(TransactionComm, long), onCommData(TransactionComm, ReadTransaction, int)); when this many heartbeats in a row got none, doTimeoutCheck(long, long, long, long) closes the link hard from the server, with no close handshake (InternalWebSocket.close(true): Jetty's Session.disconnect), and the session takes the broken -> dormant path of a communication error, so a client that comes back reconnects as after any drop, within the dormant time-out. The cut comes between three and four heartbeat intervals after the last inbound frame: 90-120 s at a 30 s heartbeat, 135-180 s at the 45 s default. The link's idle time-out (SessionMgr.getLinkIdleTimeout) does not fire first: the PINGs the server writes reset it, and only inbound silence is counted here. A frozen desktop tab keeps answering PINGs from the Browser's network service and is not cut. No server setting: a constant (CC-FIX-WS-HEARTBEAT-SKIP, Set C).

      See Also:
    • MAX_DUPLICATE_DISTANCE

      public static final int MAX_DUPLICATE_DISTANCE
      How far behind the expected serial a received serial may be to count as a transaction already received, 0x7FFF: half of the serial cycle 0x0001-0xFFFF. A serial at most this far behind is a duplicate - the client re-sent it after a reconnection because the MT_NEXT_SERIAL that acknowledged it was lost with the link - and is dropped; one further away is ahead of the expected serial, a gap (processIncoming(ReadTransaction)).
      See Also:
  • Constructor Details

    • SessionTransMgr

      public SessionTransMgr(ITransactionProcessor processor)
      Creates a new session for a new transaction processor.
      Parameters:
      processor - The transaction processor.
  • Method Details

    • isReconnectionInstance

      public static boolean isReconnectionInstance(String reconnectID, String from)
      Checks if it's a valid reconnection session instance for an existing transaction processor and attempts reconnection.
      Returns:
      The instance of the Session Manager, null if the reconnection instance is not available.
    • getReconnectionProcessor

      public static ITransactionProcessor getReconnectionProcessor(String reconnectID)
      Gets the transaction processor of the session a reconnection names (CC-FIX-APP-DEFINITIONS, D-11): the client end point constructor asks it for the application of that session before it accepts the upgrade on a port configuration, so that a reconnection is gated as a new connection is.
      Parameters:
      reconnectID - The reconnection ID of the query.
      Returns:
      The processor, or null when the session has been disposed of or has none.
    • createReconnectionInstance

      public static SessionTransMgr createReconnectionInstance(SocketAddress address, String reconnectID, int nextSerialReconnect)
      Creates a reconnection session instance for an existing transaction processor and attempts reconnection.
      Returns:
      The instance of the Session Manager, null if the reconnection instance is not available.
    • assignTransactionComm

      public void assignTransactionComm(TransactionComm comm)
      Assigns the created transaction communications instance.
    • getProcessor

      public ITransactionProcessor getProcessor()
      Gets the transaction processor for unpackaged transactions.
    • getSessionStatistics

      public SessionStatistics getSessionStatistics()
      Gets the statistics instance of the session.
      Specified by:
      getSessionStatistics in interface ISessionStatistics
      Returns:
      The SessionStatistics instance.
    • dispose

      public void dispose(boolean doAbort)
      Dispose of this session by delegating it to the Session ID.
      Parameters:
      doAbort - Abort-flag, if true pending transaction are not sent.
    • getStatisticsSnapshot

      public SessionStatistics getStatisticsSnapshot()
      Gets the statistics as a snapshot.
    • getSession

      public SessionID getSession()
      Gets the session.
      Returns:
      The session.
    • getSessionID

      public String getSessionID()
      Gets the session identifier.
      Returns:
      The session identifier, or null if disposed of.
    • doDispose

      public void doDispose(boolean doAbort)
      Called when the session ID has been disposed of by a call to its dispose method.
      Specified by:
      doDispose in interface ISessionTransMgr
      Parameters:
      doAbort - Abort-flag, if true pending transaction are not sent.
    • getCurrentState

      public SessionConnectionStatistics.State getCurrentState()
      Gets the current state.
    • isConnected

      public boolean isConnected()
      Checks if current session is connected. Be careful, do not forget that a connection can become isConnected()==false when paused!
    • isDisconnected

      public boolean isDisconnected()
      Checks if current session is connected. Be careful, do not forget that a connection can become isConnected()==false when paused!
    • isPaused

      public boolean isPaused()
      Checks if current session is connected. Be careful, do not forget that a connection can become isConnected()==false when paused!
    • doPause

      public boolean doPause()
      Requests a pause of the session from the server.
      Returns:
      true if the session still had open communication connection, false otherwise. When false is returned, the session has NOT entered real pause state.
    • createTransaction

      public SendTransaction createTransaction()
      Creates a transaction for processing normal transactions.
      Specified by:
      createTransaction in interface ITransactionCreator
      Returns:
      The new Transaction instance.
    • onCommConnected

      public void onCommConnected(TransactionComm comm)
      Called when the communication link is connected.
      Specified by:
      onCommConnected in interface TransactionCommListener
      Parameters:
      comm - The transaction communication instance.
    • onCommData

      public void onCommData(TransactionComm comm, ReadTransaction trans, int size)
      Called when the communication link has received data.
      Specified by:
      onCommData in interface TransactionCommListener
      Parameters:
      comm - The transaction communication instance.
      trans - The transaction received.
      size - The size of the data received, as it may have been uncompressed.
    • onCommHeartBeat

      public void onCommHeartBeat(TransactionComm comm, long duration)
      Called when a heart-beat frame is received.
      Specified by:
      onCommHeartBeat in interface TransactionCommListener
      Parameters:
      comm - The transaction communication instance.
      duration - Duration of the PING-PONG message exchange in milliseconds, recorded as the connection's lastHeartBeatDuration.
    • onCommTimeout

      public void onCommTimeout(TransactionComm comm, boolean isReadTimeout)
      Called when the communication link has timed out on a read or write operation.
      Specified by:
      onCommTimeout in interface TransactionCommListener
      Parameters:
      comm - The transaction communication instance.
      isReadTimeout - Flag indicating read timeout when true, false indicates write timeout.
    • onCommError

      public void onCommError(TransactionComm comm, Throwable e)
      Called when the communication link is closed.
      Specified by:
      onCommError in interface TransactionCommListener
      Parameters:
      comm - The transaction communication instance.
      e - The exception.
    • onCommClosing

      public void onCommClosing(TransactionComm comm)
      Called when the communication link is closing.
      Specified by:
      onCommClosing in interface TransactionCommListener
      Parameters:
      comm - The transaction communication instance.
    • onCommClosed

      public void onCommClosed(TransactionComm comm, int code, String reason)
      Called when the communication link is closed.
      Specified by:
      onCommClosed in interface TransactionCommListener
      Parameters:
      comm - The transaction communication instance.
    • requestPingPong

      public void requestPingPong()
      Requests a ping-pong transaction.
    • sendTransaction

      public boolean sendTransaction(SendTransaction trans)
      Send a transaction to the client, assigning the transaction serial and processing statistics.
      Parameters:
      trans - The transaction to send.
      Returns:
      true for success, false for failure.
    • closeClientAuthenticationInfo

      public void closeClientAuthenticationInfo(String info)
      Sends a close management transaction indicating the User Name or Password were incorrect.
      Parameters:
      info - The information string.
    • closeClient

      public void closeClient(String msg)
      Sends a close management transaction with an message in HTML format for the close reason.
      Parameters:
      msg - The close reason in HTML format.
    • closeClient

      public void closeClient(int closeCode, String msg)
      Closes the client with a close code and a message, then disposes of the session: the reason the client reads is "iz!" + closeCode + "!" + msg, at most 123 bytes of UTF-8 in all (the WebSocket limit), which the caller keeps (CC-SERVER-RESTART-UPDATE-V5).
      Parameters:
      closeCode - The close code: GCloseCodes.CC_APPMSG, GCloseCodes.CC_SERVER_RESTART, ...
      msg - The message.