/**
   * The main constructor for creating a FlinkKafkaProducer.
   *
   * @param defaultTopicId The default topic to write data to
   * @param serializationSchema A serializable serialization schema for turning user objects into a
   *     kafka-consumable byte[] supporting key/value messages
   * @param producerConfig Configuration properties for the KafkaProducer. 'bootstrap.servers.' is
   *     the only required argument.
   * @param customPartitioner A serializable partitioner for assigning messages to Kafka partitions.
   *     Passing null will use Kafka's partitioner
   */
  public FlinkKafkaProducerBase(
      String defaultTopicId,
      KeyedSerializationSchema<IN> serializationSchema,
      Properties producerConfig,
      KafkaPartitioner<IN> customPartitioner) {
    requireNonNull(defaultTopicId, "TopicID not set");
    requireNonNull(serializationSchema, "serializationSchema not set");
    requireNonNull(producerConfig, "producerConfig not set");
    ClosureCleaner.ensureSerializable(customPartitioner);
    ClosureCleaner.ensureSerializable(serializationSchema);

    this.defaultTopicId = defaultTopicId;
    this.schema = serializationSchema;
    this.producerConfig = producerConfig;

    // set the producer configuration properties.

    if (!producerConfig.contains(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG)) {
      this.producerConfig.put(
          ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class.getCanonicalName());
    } else {
      LOG.warn(
          "Overwriting the '{}' is not recommended", ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG);
    }

    if (!producerConfig.contains(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG)) {
      this.producerConfig.put(
          ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
          ByteArraySerializer.class.getCanonicalName());
    } else {
      LOG.warn(
          "Overwriting the '{}' is not recommended", ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG);
    }

    // create a local KafkaProducer to get the list of partitions.
    // this will also ensure locally that all required ProducerConfig values are set.
    try (Producer<Void, IN> getPartitionsProd = getKafkaProducer(this.producerConfig)) {
      List<PartitionInfo> partitionsList = getPartitionsProd.partitionsFor(defaultTopicId);

      this.partitions = new int[partitionsList.size()];
      for (int i = 0; i < partitions.length; i++) {
        partitions[i] = partitionsList.get(i).partition();
      }
      getPartitionsProd.close();
    }

    this.partitioner = customPartitioner;
    this.producerId = UUID.randomUUID().toString();
  }
  /**
   * Create a new FlinkKinesisProducer. This is a constructor supporting {@see
   * KinesisSerializationSchema}.
   *
   * @param schema Kinesis serialization schema for the data type
   * @param configProps The properties used to configure AWS credentials and AWS region
   */
  public FlinkKinesisProducer(KinesisSerializationSchema<OUT> schema, Properties configProps) {
    this.configProps = checkNotNull(configProps, "configProps can not be null");

    // check the configuration properties for any conflicting settings
    KinesisConfigUtil.validateProducerConfiguration(this.configProps);

    ClosureCleaner.ensureSerializable(Objects.requireNonNull(schema));
    this.schema = schema;
  }
 public AccumulatingAlignedProcessingTimeWindowOperatorTest() {
   ClosureCleaner.clean(identitySelector, false);
   ClosureCleaner.clean(validatingIdentityFunction, false);
 }
 public void setCustomPartitioner(KinesisPartitioner<OUT> partitioner) {
   Objects.requireNonNull(partitioner);
   ClosureCleaner.ensureSerializable(partitioner);
   this.customPartitioner = partitioner;
 }
 public AggregatingAlignedProcessingTimeWindowOperatorTest() {
   ClosureCleaner.clean(fieldOneSelector, false);
   ClosureCleaner.clean(sumFunction, false);
 }