hudson.remoting
Class AbstractByteArrayCommandTransport

java.lang.Object
  extended by hudson.remoting.CommandTransport
      extended by hudson.remoting.AbstractByteArrayCommandTransport

public abstract class AbstractByteArrayCommandTransport
extends CommandTransport

CommandTransport that works with byte[] instead of command object. This base class hides away some of the Command serialization details. One less thing for transport implementers to worry about.

Since:
2.13
Author:
Kohsuke Kawaguchi

Nested Class Summary
static interface AbstractByteArrayCommandTransport.ByteArrayReceiver
           
 
Field Summary
protected  Channel channel
           
 
Constructor Summary
AbstractByteArrayCommandTransport()
           
 
Method Summary
abstract  void setup(AbstractByteArrayCommandTransport.ByteArrayReceiver receiver)
          Starts the transport.
 void setup(Channel channel, hudson.remoting.CommandTransport.CommandReceiver receiver)
          Starts the transport.
 void write(hudson.remoting.Command cmd, boolean last)
          Called by Channel to send one command to the other side.
abstract  void writeBlock(Channel channel, byte[] payload)
          Writes a byte[] to the transport.
 
Methods inherited from class hudson.remoting.CommandTransport
closeRead, closeWrite, getRemoteCapability
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

channel

protected Channel channel
Constructor Detail

AbstractByteArrayCommandTransport

public AbstractByteArrayCommandTransport()
Method Detail

writeBlock

public abstract void writeBlock(Channel channel,
                                byte[] payload)
                         throws java.io.IOException
Writes a byte[] to the transport. The block boundary is significant. A transport needs to ensure that that the same byte[] is read by the peer (unlike TCP, where a single write can be split into multiple read()s on the other side.)

Throws:
java.io.IOException

setup

public abstract void setup(AbstractByteArrayCommandTransport.ByteArrayReceiver receiver)
Starts the transport. See CommandTransport.setup(Channel, CommandReceiver) for more details. In this subtype, we pass in AbstractByteArrayCommandTransport.ByteArrayReceiver that uses byte[] instead of Command


setup

public final void setup(Channel channel,
                        hudson.remoting.CommandTransport.CommandReceiver receiver)
Description copied from class: CommandTransport
Starts the transport. This method is called once and only once at the end of the initialization of Channel, after the CommandTransport.getRemoteCapability() is invoked. The first purpose of this method is to provide a reference back to Channel, and the second purpose of this method is to allow CommandTransport to message pumping, where it starts receiving commands from the other side and pass them onto CommandReceiver. This abstraction enables asynchronous processing — for example you can have a single thread serving a large number of Channels via NIO. For subtypes that prefer synchronous operation, extend from SynchronousCommandTransport.

Closing the read pump

Channel implements its own "end of command stream" marker, and therefore under the orderly shutdown scenario, it doesn't rely on the transport to provide EOF-like marker. Instead, Channel will call your CommandTransport.closeRead() (from the same thread that invoked CommandReceiver#handle(Command)) to indicate that it is done with the reading.

If the transport encounters any error from the lower layer (say, the underlying TCP/IP socket encountered a REST), then call CommandReceiver#terminate(IOException) to initiate the abnormal channel termination. This in turn calls CommandTransport.closeRead() to shutdown the reader side.

Specified by:
setup in class CommandTransport

write

public final void write(hudson.remoting.Command cmd,
                        boolean last)
                 throws java.io.IOException
Description copied from class: CommandTransport
Called by Channel to send one command to the other side. Channel serializes the invocation of this method for ordering. That is, at any given point in time only one thread executes this method.

Asynchronous transport must serialize the given command object before returning from this method, as its content can be modified by the calling thread as soon as this method returns. Also, if an asynchronous transport chooses to return from this method without committing data to the network, then it is also responsible for a flow control (by blocking this method if too many commands are queueing up waiting for the network to unclog.)

Parameters:
cmd - The command object that needs to be sent. Never null. This must be serialized via Command.writeTo(Channel, ObjectOutputStream)
last - Informational flag that indicates that this is the last call of the CommandTransport.write(Command, boolean).
Throws:
java.io.IOException


Copyright © 2013. All Rights Reserved.