Class AbstractConnection

  • All Implemented Interfaces:
    Runnable
    Direct Known Subclasses:
    OtpConnection, OtpCookedConnection

    public abstract class AbstractConnection
    extends Thread
    Maintains a connection between a Java process and a remote Erlang, Java or C node. The object maintains connection state and allows data to be sent to and received from the peer.

    This abstract class provides the necessary methods to maintain the actual connection and encode the messages and headers in the proper format according to the Erlang distribution protocol. Subclasses can use these methods to provide a more or less transparent communication channel as desired.

    Note that no receive methods are provided. Subclasses must provide methods for message delivery, and may implement their own receive methods.

    If an exception occurs in any of the methods in this class, the connection will be closed and must be reopened in order to resume communication with the peer. This will be indicated to the subclass by passing the exception to its delivery() method.

    The System property OtpConnection.trace can be used to change the initial trace level setting for all connections. Normally the initial trace level is 0 and connections are not traced unless setTraceLevel() is used to change the setting for a particular connection. OtpConnection.trace can be used to turn on tracing by default for all connections.

    • Method Detail

      • deliver

        public abstract void deliver​(Exception e)
        Deliver communication exceptions to the recipient.
      • deliver

        public abstract void deliver​(OtpMsg msg)
        Deliver messages to the recipient.
      • sendBuf

        protected void sendBuf​(OtpErlangPid from,
                               String dest,
                               OtpOutputStream payload)
                        throws IOException
        Send a pre-encoded message to a named process on a remote node.
        Parameters:
        dest - the name of the remote process.
        payload - the encoded message to send.
        Throws:
        IOException - if the connection is not active or a communication error occurs.
      • sendBuf

        protected void sendBuf​(OtpErlangPid from,
                               OtpErlangPid dest,
                               OtpOutputStream payload)
                        throws IOException
        Send a pre-encoded message to a process on a remote node.
        Parameters:
        dest - the Erlang PID of the remote process.
        payload - the encoded message to send.
        Throws:
        IOException - if the connection is not active or a communication error occurs.
      • sendLink

        protected void sendLink​(OtpErlangPid from,
                                OtpErlangPid dest)
                         throws IOException
        Create a link between the local node and the specified process on the remote node. If the link is still active when the remote process terminates, an exit signal will be sent to this connection. Use unlink() to remove the link.
        Parameters:
        dest - the Erlang PID of the remote process.
        Throws:
        IOException - if the connection is not active or a communication error occurs.
      • sendUnlink

        protected void sendUnlink​(OtpErlangPid from,
                                  OtpErlangPid dest)
                           throws IOException
        Remove a link between the local node and the specified process on the remote node. This method deactivates links created with link().
        Parameters:
        dest - the Erlang PID of the remote process.
        Throws:
        IOException - if the connection is not active or a communication error occurs.
      • sendExit2

        protected void sendExit2​(OtpErlangPid from,
                                 OtpErlangPid dest,
                                 OtpErlangObject reason)
                          throws IOException
        Send an exit signal to a remote process.
        Parameters:
        dest - the Erlang PID of the remote process.
        reason - an Erlang term describing the exit reason.
        Throws:
        IOException - if the connection is not active or a communication error occurs.
      • run

        public void run()
        Specified by:
        run in interface Runnable
        Overrides:
        run in class Thread
      • setTraceLevel

        public int setTraceLevel​(int level)

        Set the trace level for this connection. Normally tracing is off by default unless System property OtpConnection.trace was set.

        The following levels are valid: 0 turns off tracing completely, 1 shows ordinary send and receive messages, 2 shows control messages such as link and unlink, 3 shows handshaking at connection setup, and 4 shows communication with Epmd. Each level includes the information shown by the lower ones.

        Parameters:
        level - the level to set.
        Returns:
        the previous trace level.
      • getTraceLevel

        public int getTraceLevel()
        Get the trace level for this connection.
        Returns:
        the current trace level.
      • close

        public void close()
        Close the connection to the remote node.
      • finalize

        protected void finalize()
        Overrides:
        finalize in class Object
      • isConnected

        public boolean isConnected()
        Determine if the connection is still alive. Note that this method only reports the status of the connection, and that it is possible that there are unread messages waiting in the receive queue.
        Returns:
        true if the connection is alive.
      • genChallenge

        protected static int genChallenge()
      • genDigest

        protected byte[] genDigest​(int challenge,
                                   String cookie)
      • sendChallenge

        protected void sendChallenge​(int dist,
                                     int aflags,
                                     int challenge)
                              throws IOException
        Throws:
        IOException
      • sendChallengeReply

        protected void sendChallengeReply​(int challenge,
                                          byte[] digest)
                                   throws IOException
        Throws:
        IOException
      • sendChallengeAck

        protected void sendChallengeAck​(byte[] digest)
                                 throws IOException
        Throws:
        IOException
      • setFlags

        public void setFlags​(int flags)
      • getFlags

        public int getFlags()