code: @Override
    public void start() {
      if(layout == null) {
        initializationFailed = true;
        addError("Invalid configuration - No layout for appender: " + name);
        return;
      }
  
      if(streamName == null) {
        initializationFailed = true;
        addError("Invalid configuration - streamName cannot be null for appender: " + name);
        return;
      }
  
      ClientConfiguration clientConfiguration = new ClientConfiguration();
      clientConfiguration.setMaxErrorRetry(maxRetries);
      clientConfiguration
          .setRetryPolicy(new RetryPolicy(PredefinedRetryPolicies.DEFAULT_RETRY_CONDITION,
                                          PredefinedRetryPolicies.DEFAULT_BACKOFF_STRATEGY, maxRetries, true));
      clientConfiguration.setUserAgent(AppenderConstants.USER_AGENT_STRING);
  
      BlockingQueue<Runnable> taskBuffer = new LinkedBlockingDeque<Runnable>(bufferSize);
      threadPoolExecutor = new ThreadPoolExecutor(threadCount, threadCount,
                                                  AppenderConstants.DEFAULT_THREAD_KEEP_ALIVE_SEC, TimeUnit.SECONDS,
                                                  taskBuffer, setupThreadFactory(), new BlockFastProducerPolicy());
      threadPoolExecutor.prestartAllCoreThreads();
  
      this.client = createClient(credentials, clientConfiguration, threadPoolExecutor);
  
      client.setRegion(findRegion());
      if(!Validator.isBlank(endpoint)) {
        if(!Validator.isBlank(region)) {
          addError("Received configuration for both region as well as Amazon Kinesis endpoint. (" + endpoint
                   + ") will be used as endpoint instead of default endpoint for region (" + region + ")");
        }
        client.setEndpoint(endpoint);
      }
  
      validateStreamName(client, streamName);
  
      super.start();
    }
docs: Configures appender instance and makes it ready for use by the consumers.
  It validates mandatory parameters and confirms if the configured stream is
  ready for publishing data yet.
  
  Error details are made available through the fallback handler for this
  appender
  
  @throws IllegalStateException if we encounter issues configuring this
  appender instance