Class DefaultLogStream

java.lang.Object
com.google.common.collect.UnmodifiableIterator<LogMessage>
com.google.common.collect.AbstractIterator<LogMessage>
com.spotify.docker.client.DefaultLogStream
All Implemented Interfaces:
LogStream, Closeable, AutoCloseable, Iterator<LogMessage>

class DefaultLogStream extends com.google.common.collect.AbstractIterator<LogMessage> implements LogStream
  • Field Details

  • Constructor Details

    • DefaultLogStream

      private DefaultLogStream(InputStream stream)
    • DefaultLogStream

      DefaultLogStream(LogReader reader)
  • Method Details

    • create

      static DefaultLogStream create(InputStream stream)
    • computeNext

      protected LogMessage computeNext()
      Specified by:
      computeNext in class com.google.common.collect.AbstractIterator<LogMessage>
    • close

      public void close()
      Description copied from interface: LogStream
      Redefine to not throw checked exceptions.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Specified by:
      close in interface LogStream
    • readFully

      public String readFully()
      Specified by:
      readFully in interface LogStream
    • attach

      public void attach(OutputStream stdout, OutputStream stderr) throws IOException
      Description copied from interface: LogStream
      Attaches two OutputStreams to the LogStream. Closes the streams after use.
      Specified by:
      attach in interface LogStream
      Parameters:
      stdout - OutputStream for the standard out
      stderr - OutputStream for the standard err
      Throws:
      IOException - if an I/O error occurs
      See Also:
    • attach

      public void attach(OutputStream stdout, OutputStream stderr, boolean closeAtEof) throws IOException
      Description copied from interface: LogStream
      Attaches two OutputStreams to the LogStream.

      Example usage:

       
       dockerClient
           .attachContainer(containerId,
               AttachParameter.LOGS, AttachParameter.STDOUT,
               AttachParameter.STDERR, AttachParameter.STREAM)
           .attach(System.out, System.err);
       
       

      Typically you use PipedOutputStream connected to a PipedInputStream which are read by - for example - an InputStreamReader or a Scanner. For small inputs, the PipedOutputStream just writes to the buffer of the PipedInputStream, but you actually want to read and write from separate threads, as it may deadlock the thread.

       
         final PipedInputStream stdout = new PipedInputStream();
         final PipedInputStream stderr = new PipedInputStream();
         final PipedOutputStream stdout_pipe = new PipedOutputStream(stdout);
         final PipedOutputStream stderr_pipe = new PipedOutputStream(stderr);
      
         executor.submit(new Callable&lt;Void&gt;() {
           &#064;Override
           public Void call() throws Exception {
             dockerClient.attachContainer(containerId,
                 AttachParameter.LOGS, AttachParameter.STDOUT,
                 AttachParameter.STDERR, AttachParameter.STREAM
               .attach(stdout_pipe, stderr_pipe);
             return null;
           }
         });
      
         try (Scanner sc_stdout = new Scanner(stdout); Scanner sc_stderr = new Scanner(stderr)) {
           // ... read here
         }
       
       
      Specified by:
      attach in interface LogStream
      Parameters:
      stdout - OutputStream for the standard out
      stderr - OutputStream for the standard err
      closeAtEof - whether to close the streams when this log stream ends
      Throws:
      IOException - if an I/O error occurs
      See Also:
    • writeAndFlush

      private static void writeAndFlush(ByteBuffer buffer, OutputStream outputStream) throws IOException
      Write the contents of the given ByteBuffer to the OutputStream and flush the stream.
      Throws:
      IOException