All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.gesellix.docker.client.DockerAsyncConsumer.groovy Maven / Gradle / Ivy

package de.gesellix.docker.client

import de.gesellix.docker.engine.EngineResponse
import de.gesellix.docker.response.JsonChunksReader
import de.gesellix.docker.response.LineReader
import de.gesellix.docker.response.Reader
import groovy.util.logging.Slf4j
import okio.Okio
import okio.Source

@Slf4j
class DockerAsyncConsumer implements Runnable {

  private EngineResponse response
  private DockerAsyncCallback callback

  DockerAsyncConsumer(EngineResponse response, DockerAsyncCallback callback) {
    this.response = response
    this.callback = callback
  }

  @Override
  void run() {
    try {
      Reader reader = createReader(response)
      while (reader.hasNext()) {
        def chunk = reader.readNext(Object)
        log.trace("event: $chunk")
        callback.onEvent(chunk)
      }
    }
    catch (InterruptedException | InterruptedIOException e) {
      log.debug("consumer interrupted", e)
      Thread.currentThread().interrupt()
    }
    catch (Exception e) {
      log.error("error reading from stream", e)
      throw new RuntimeException(e)
    }
    finally {
      callback?.onFinish()
      response.stream?.close()
    }
  }

  private Reader createReader(EngineResponse response) {
    Source source = Okio.source(response.stream as InputStream)
    if (response.contentType == "application/json"
        && response.headers?.get("transfer-encoding") == "chunked") {
      return new JsonChunksReader(Okio.source(response.stream as InputStream))
    }
    else {
      return new LineReader(source)
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy