Project JXTA

net.jxta.impl.pipe
Class NonBlockingOutputPipe

java.lang.Object
  extended by net.jxta.impl.pipe.NonBlockingOutputPipe
All Implemented Interfaces:
Runnable, EventListener, PipeResolver.Listener, OutputPipe
Direct Known Subclasses:
SecureOutputPipe

 class NonBlockingOutputPipe
extends Object
implements PipeResolver.Listener, OutputPipe, Runnable

An implementation of Ouput Pipe which sends messages on the pipe asynchronously. The send() method for this implementation will never block.


Nested Class Summary
(package private) static class NonBlockingOutputPipe.workerState
          Tracks the state of our worker thread.
 
Constructor Summary
NonBlockingOutputPipe(PeerGroup g, PipeResolver r, PipeAdvertisement pAdv, PeerID destPeer, Set peers)
          Create a new output pipe
 
Method Summary
 void close()
          
protected  void finalize()
          
 PipeAdvertisement getAdvertisement()
          
 String getName()
          
 ID getPipeID()
          
 String getType()
          
 boolean isClosed()
          
protected  EndpointAddress mkAddress(ID destPeer, ID pipeID)
          Convenience method for constructing a peer endpoint address from its peer id
 boolean pipeNAKEvent(PipeResolver.Event event)
          A NAK Event was received for this pipe
 boolean pipeResolveEvent(PipeResolver.Event event)
          Pipe Resolve Event
 void run()
          

Sends the messages.

 boolean send(Message msg)
          
 
Methods inherited from class java.lang.Object
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

NonBlockingOutputPipe

public NonBlockingOutputPipe(PeerGroup g,
                             PipeResolver r,
                             PipeAdvertisement pAdv,
                             PeerID destPeer,
                             Set peers)
Create a new output pipe

Parameters:
g - peergroup we are working in.
r - the piperesolver this pipe is bound to.
pAdv - advertisement for the pipe we are supporting.
destPeer - the peer this pipe is currently bound to.
peers - the set of peers we allow this pipe to be bound to.
Method Detail

finalize

protected void finalize()

Overrides:
finalize in class Object

close

public void close()

Specified by:
close in interface OutputPipe

isClosed

public boolean isClosed()

Specified by:
isClosed in interface OutputPipe

getType

public final String getType()

Specified by:
getType in interface OutputPipe

getPipeID

public final ID getPipeID()

Specified by:
getPipeID in interface OutputPipe

getName

public final String getName()

Specified by:
getName in interface OutputPipe

getAdvertisement

public final PipeAdvertisement getAdvertisement()

Specified by:
getAdvertisement in interface OutputPipe

send

public boolean send(Message msg)
             throws IOException

Specified by:
send in interface OutputPipe
Throws:
IOException

run

public void run()

Sends the messages.

This method does a lot of things. It has several distinct states:

Acquire a messenger to the specified destination peer. If a messenger is acquired, then go to SENDMESSAGES state otherwise go to STARTMIGRATE.
STATE Activity
ACQUIREMESSENGER
SENDMESSAGES Send messages until queue is closed and all messages have been sent. Go to state CLOSED when done. If the messenger becomes closed then go to ACQUIREMESSENGER. If there are no messages to send for IDLEWORKERLINGER millisecondsthen the worker thread will exit. It will only be restarted if another message is eventually enqueued.
STARTVERIFY Starts a verification query(s) to the destination peer. This state is activated after PipeServiceImpl.VERIFYINTERVAL milliseconds of sending messages. The query responses will be tracked in the PENDINGVERIFY state.
STARTMIGRATE Starts a query(s) for peers listening on this pipe. The query responses will be tracked in the PENDINGMIGRATE state.
PENDINGVERIFY Issues query messages to verify that the destination peer is still listening on the pipe. Queries are issued every QUERYINTERVAL milliseconds. If a positive response is received, go to state ACQUIREMESSENGER. If no response is received within QUERYTIMEOUT milliseconds or a negative response is received then go to state STARTMIGRATE.
PENDINGMIGRATE Issues query messages to find a new destination peer. Queries are issued every QUERYINTERVAL milliseconds. If a positive response is received, go to state ACQUIREMESSENGER. If no positive response from an eligible peer is received within QUERYTIMEOUT milliseconds go to state CLOSED.
CLOSED Exit the worker thread.

Specified by:
run in interface Runnable

mkAddress

protected EndpointAddress mkAddress(ID destPeer,
                                    ID pipeID)
Convenience method for constructing a peer endpoint address from its peer id

Parameters:
destPeer - the desitnation peer
pipeID - the pipe to put in the param field.
Returns:
the pipe endpoint address.

pipeNAKEvent

public boolean pipeNAKEvent(PipeResolver.Event event)
A NAK Event was received for this pipe

Specified by:
pipeNAKEvent in interface PipeResolver.Listener
Returns:
true if the event was handled otherwise false

pipeResolveEvent

public boolean pipeResolveEvent(PipeResolver.Event event)
Pipe Resolve Event

Specified by:
pipeResolveEvent in interface PipeResolver.Listener
Returns:
true if the event was handled otherwise false

JXTA J2SE