Class AbstractConnection
- java.lang.Object
-
- java.lang.Thread
-
- com.ericsson.otp.erlang.AbstractConnection
-
- All Implemented Interfaces:
java.lang.Runnable
- Direct Known Subclasses:
OtpConnection,OtpCookedConnection
public abstract class AbstractConnection extends java.lang.ThreadMaintains 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.
-
-
Field Summary
Fields Modifier and Type Field Description protected static intChallengeAckprotected static intChallengeReplyprotected static intChallengeStatusprotected booleanconnectedprotected booleancookieOkprotected static intctrlThresholdprotected static intdefaultLevelprotected static intexit2Tagprotected static intexit2TTTagprotected static intexitTagprotected static intexitTTTagprotected static intgroupLeaderTagprotected static inthandshakeThresholdprotected static intheaderLenprotected static intlinkTagprotected OtpLocalNodelocalNodeprotected static bytepassThroughprotected OtpPeerpeerprotected static java.util.Randomrandomprotected static intregSendTagprotected static intregSendTTTagprotected booleansendCookieprotected static intsendTagprotected static intsendThresholdprotected static intsendTTTagprotected OtpTransportsocketprotected inttraceLevelprotected static intunlinkTagprotected static byteversion
-
Constructor Summary
Constructors Modifier Constructor Description protectedAbstractConnection(OtpLocalNode self, OtpPeer other)Intiate and open a connection to a remote node.protectedAbstractConnection(OtpLocalNode self, OtpTransport s)Accept an incoming connection from a remote node.
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description voidclose()Close the connection to the remote node.abstract voiddeliver(OtpMsg msg)Deliver messages to the recipient.abstract voiddeliver(java.lang.Exception e)Deliver communication exceptions to the recipient.protected voiddo_send(OtpOutputStream header)protected voiddo_send(OtpOutputStream header, OtpOutputStream payload)protected voiddoAccept()protected voiddoConnect(int port)protected voidfinalize()protected static intgenChallenge()protected byte[]genDigest(int challenge, java.lang.String cookie)intgetFlags()intgetTraceLevel()Get the trace level for this connection.protected java.lang.StringheaderType(OtpErlangObject h)booleanisConnected()Determine if the connection is still alive.protected byte[]read2BytePackage()protected intreadSock(OtpTransport s, byte[] b)protected intrecvChallenge()protected voidrecvChallengeAck(int our_challenge)protected intrecvChallengeReply(int our_challenge)protected voidrecvName(OtpPeer apeer)protected voidrecvStatus()voidrun()protected voidsendBuf(OtpErlangPid from, OtpErlangPid dest, OtpOutputStream payload)Send a pre-encoded message to a process on a remote node.protected voidsendBuf(OtpErlangPid from, java.lang.String dest, OtpOutputStream payload)Send a pre-encoded message to a named process on a remote node.protected voidsendChallenge(int dist, int aflags, int challenge)protected voidsendChallengeAck(byte[] digest)protected voidsendChallengeReply(int challenge, byte[] digest)protected voidsendExit(OtpErlangPid from, OtpErlangPid dest, OtpErlangObject reason)protected voidsendExit2(OtpErlangPid from, OtpErlangPid dest, OtpErlangObject reason)Send an exit signal to a remote process.protected voidsendLink(OtpErlangPid from, OtpErlangPid dest)Create a link between the local node and the specified process on the remote node.protected voidsendName(int dist, int aflags)protected voidsendStatus(java.lang.String status)protected voidsendUnlink(OtpErlangPid from, OtpErlangPid dest)Remove a link between the local node and the specified process on the remote node.voidsetFlags(int flags)intsetTraceLevel(int level)Set the trace level for this connection.-
Methods inherited from class java.lang.Thread
activeCount, checkAccess, clone, countStackFrames, currentThread, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, onSpinWait, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, suspend, toString, yield
-
-
-
-
Field Detail
-
headerLen
protected static final int headerLen
- See Also:
- Constant Field Values
-
passThrough
protected static final byte passThrough
- See Also:
- Constant Field Values
-
version
protected static final byte version
- See Also:
- Constant Field Values
-
linkTag
protected static final int linkTag
- See Also:
- Constant Field Values
-
sendTag
protected static final int sendTag
- See Also:
- Constant Field Values
-
exitTag
protected static final int exitTag
- See Also:
- Constant Field Values
-
unlinkTag
protected static final int unlinkTag
- See Also:
- Constant Field Values
-
regSendTag
protected static final int regSendTag
- See Also:
- Constant Field Values
-
groupLeaderTag
protected static final int groupLeaderTag
- See Also:
- Constant Field Values
-
exit2Tag
protected static final int exit2Tag
- See Also:
- Constant Field Values
-
sendTTTag
protected static final int sendTTTag
- See Also:
- Constant Field Values
-
exitTTTag
protected static final int exitTTTag
- See Also:
- Constant Field Values
-
regSendTTTag
protected static final int regSendTTTag
- See Also:
- Constant Field Values
-
exit2TTTag
protected static final int exit2TTTag
- See Also:
- Constant Field Values
-
ChallengeReply
protected static final int ChallengeReply
- See Also:
- Constant Field Values
-
ChallengeAck
protected static final int ChallengeAck
- See Also:
- Constant Field Values
-
ChallengeStatus
protected static final int ChallengeStatus
- See Also:
- Constant Field Values
-
connected
protected boolean connected
-
socket
protected OtpTransport socket
-
peer
protected OtpPeer peer
-
localNode
protected OtpLocalNode localNode
-
cookieOk
protected boolean cookieOk
-
sendCookie
protected boolean sendCookie
-
traceLevel
protected int traceLevel
-
defaultLevel
protected static int defaultLevel
-
sendThreshold
protected static int sendThreshold
-
ctrlThreshold
protected static int ctrlThreshold
-
handshakeThreshold
protected static int handshakeThreshold
-
random
protected static java.util.Random random
-
-
Constructor Detail
-
AbstractConnection
protected AbstractConnection(OtpLocalNode self, OtpTransport s) throws java.io.IOException, OtpAuthException
Accept an incoming connection from a remote node. Used byOtpSelf.accept()to create a connection based on data received when handshaking with the peer node, when the remote node is the connection initiator.- Throws:
java.io.IOException- if it was not possible to connect to the peer.OtpAuthException- if handshake resulted in an authentication error
-
AbstractConnection
protected AbstractConnection(OtpLocalNode self, OtpPeer other) throws java.io.IOException, OtpAuthException
Intiate and open a connection to a remote node.- Throws:
java.io.IOException- if it was not possible to connect to the peer.OtpAuthException- if handshake resulted in an authentication error.
-
-
Method Detail
-
deliver
public abstract void deliver(java.lang.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, java.lang.String dest, OtpOutputStream payload) throws java.io.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:
java.io.IOException- if the connection is not active or a communication error occurs.
-
sendBuf
protected void sendBuf(OtpErlangPid from, OtpErlangPid dest, OtpOutputStream payload) throws java.io.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:
java.io.IOException- if the connection is not active or a communication error occurs.
-
sendLink
protected void sendLink(OtpErlangPid from, OtpErlangPid dest) throws java.io.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. Useunlink()to remove the link.- Parameters:
dest- the Erlang PID of the remote process.- Throws:
java.io.IOException- if the connection is not active or a communication error occurs.
-
sendUnlink
protected void sendUnlink(OtpErlangPid from, OtpErlangPid dest) throws java.io.IOException
Remove a link between the local node and the specified process on the remote node. This method deactivates links created withlink().- Parameters:
dest- the Erlang PID of the remote process.- Throws:
java.io.IOException- if the connection is not active or a communication error occurs.
-
sendExit
protected void sendExit(OtpErlangPid from, OtpErlangPid dest, OtpErlangObject reason) throws java.io.IOException
- Throws:
java.io.IOException
-
sendExit2
protected void sendExit2(OtpErlangPid from, OtpErlangPid dest, OtpErlangObject reason) throws java.io.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:
java.io.IOException- if the connection is not active or a communication error occurs.
-
run
public void run()
- Specified by:
runin interfacejava.lang.Runnable- Overrides:
runin classjava.lang.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:
finalizein classjava.lang.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.
-
do_send
protected void do_send(OtpOutputStream header, OtpOutputStream payload) throws java.io.IOException
- Throws:
java.io.IOException
-
do_send
protected void do_send(OtpOutputStream header) throws java.io.IOException
- Throws:
java.io.IOException
-
headerType
protected java.lang.String headerType(OtpErlangObject h)
-
readSock
protected int readSock(OtpTransport s, byte[] b) throws java.io.IOException
- Throws:
java.io.IOException
-
doAccept
protected void doAccept() throws java.io.IOException, OtpAuthException- Throws:
java.io.IOExceptionOtpAuthException
-
doConnect
protected void doConnect(int port) throws java.io.IOException, OtpAuthException- Throws:
java.io.IOExceptionOtpAuthException
-
genChallenge
protected static int genChallenge()
-
genDigest
protected byte[] genDigest(int challenge, java.lang.String cookie)
-
sendName
protected void sendName(int dist, int aflags) throws java.io.IOException- Throws:
java.io.IOException
-
sendChallenge
protected void sendChallenge(int dist, int aflags, int challenge) throws java.io.IOException- Throws:
java.io.IOException
-
read2BytePackage
protected byte[] read2BytePackage() throws java.io.IOException, OtpErlangDecodeException- Throws:
java.io.IOExceptionOtpErlangDecodeException
-
recvName
protected void recvName(OtpPeer apeer) throws java.io.IOException
- Throws:
java.io.IOException
-
recvChallenge
protected int recvChallenge() throws java.io.IOException- Throws:
java.io.IOException
-
sendChallengeReply
protected void sendChallengeReply(int challenge, byte[] digest) throws java.io.IOException- Throws:
java.io.IOException
-
recvChallengeReply
protected int recvChallengeReply(int our_challenge) throws java.io.IOException, OtpAuthException- Throws:
java.io.IOExceptionOtpAuthException
-
sendChallengeAck
protected void sendChallengeAck(byte[] digest) throws java.io.IOException- Throws:
java.io.IOException
-
recvChallengeAck
protected void recvChallengeAck(int our_challenge) throws java.io.IOException, OtpAuthException- Throws:
java.io.IOExceptionOtpAuthException
-
sendStatus
protected void sendStatus(java.lang.String status) throws java.io.IOException- Throws:
java.io.IOException
-
recvStatus
protected void recvStatus() throws java.io.IOException- Throws:
java.io.IOException
-
setFlags
public void setFlags(int flags)
-
getFlags
public int getFlags()
-
-