/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.jafka.producer; import java.util.List; import java.util.Properties; import io.jafka.common.InvalidConfigException; import io.jafka.common.annotations.ClientSide; import io.jafka.message.CompressionCodec; import io.jafka.producer.async.AsyncProducerConfig; import io.jafka.producer.async.AsyncProducerConfigShared; import io.jafka.utils.Utils; import io.jafka.utils.ZKConfig; /** * Configuration for producer * @author adyliu (imxylz@gmail.com) * @since 1.0 */ @ClientSide public class ProducerConfig extends ZKConfig implements SyncProducerConfigShared, AsyncProducerConfigShared { private final SyncProducerConfigShared synchConfigShared; private final AsyncProducerConfigShared asyncProducerConfigShared; /** * create config for producer * @param props config arguments */ public ProducerConfig(Properties props) { super(props); synchConfigShared = new SyncProducerConfig(props); asyncProducerConfigShared = new AsyncProducerConfig(props); check(); } private void check() { if (getBrokerList() != null && Utils.getString(props, "partitioner.class", null) != null) { throw new InvalidConfigException("partitioner.class cannot be used when broker.list is set"); } // If both broker.list and zk.connect options are specified, throw an exception if (getBrokerList() != null && getZkConnect() != null) { throw new InvalidConfigException("only one of broker.list and zk.connect can be specified"); } if (getBrokerList() == null && getZkConnect() == null) { throw new InvalidConfigException("At least one of zk.connect or broker.list must be specified"); } } /** * the full properties * @return property */ public Properties getProperties() { return props; } public int getBufferSize() { return synchConfigShared.getBufferSize(); } public int getConnectTimeoutMs() { return synchConfigShared.getConnectTimeoutMs(); } public int getSocketTimeoutMs() { return synchConfigShared.getSocketTimeoutMs(); } //public int getMaxMessageSize() { // return synchConfigShared.getMaxMessageSize(); //} public int getQueueTime() { return asyncProducerConfigShared.getQueueTime(); } public int getQueueSize() { return asyncProducerConfigShared.getQueueSize(); } public int getEnqueueTimeoutMs() { return asyncProducerConfigShared.getEnqueueTimeoutMs(); } public int getBatchSize() { return asyncProducerConfigShared.getBatchSize(); } public String getSerializerClass() { return synchConfigShared.getSerializerClass(); } public String getCbkHandler() { return asyncProducerConfigShared.getCbkHandler(); } public Properties getCbkHandlerProperties() { return asyncProducerConfigShared.getCbkHandlerProperties(); } public String getEventHandler() { return asyncProducerConfigShared.getEventHandler(); } public Properties getEventHandlerProperties() { return asyncProducerConfigShared.getEventHandlerProperties(); } /** * For bypassing zookeeper based auto partition discovery, use this config to pass in * static broker and per-broker partition information. Format- * * <pre> * brokerid1:host1:port1[:partitions[:autocreatetopic]], brokerid2:host2:port2[:partitions[:autocreatetopic]] * </pre> * @return broker list */ public String getBrokerList() { return Utils.getString(props, "broker.list", null); } /** the partitioner class for partitioning events amongst sub-topics * @return class of partition rule */ public String getPartitionerClass() { return Utils.getString(props, "partitioner.class", DefaultPartitioner.class.getName()); } /** * This parameter allows you to specify the compression codec for all data generated by * this producer. The default is {@link CompressionCodec#NoCompressionCodec} * * @see CompressionCodec#NoCompressionCodec * @return default compress code */ public CompressionCodec getCompressionCodec() { return CompressionCodec.valueOf(Utils.getInt(props, "compression.codec", 0)); } /** * This parameter allows you to set whether compression should be turned * on for * particular topics * * If the compression codec is anything other than NoCompressionCodec, * * Enable compression only for specified topics if any * * If the list of compressed topics is empty, then enable the specified compression codec * for all topics * * If the compression codec is NoCompressionCodec, compression is disabled for all topics * @return topic list of compressed */ public List<String> getCompressedTopics() { return Utils.getCSVList(Utils.getString(props, "compressed.topics", null)); } /** * this parameter specifies whether the messages are sent asynchronously or not. Valid * values are * * <pre> * async: for asynchronous send * sync: for synchronous send * </pre> * @return producer type */ public String getProducerType() { return Utils.getString(props, "producer.type", "sync"); } /** * The producer using the zookeeper software load balancer maintains a ZK cache that gets * updated by the zookeeper watcher listeners. During some events like a broker bounce, the * producer ZK cache can get into an inconsistent state, for a small time period. In this * time period, it could end up picking a broker partition that is unavailable. When this * happens, the ZK cache needs to be updated. This parameter specifies the number of times * the producer attempts to refresh this ZK cache. * @return times of zookeeper retry */ public int getZkReadRetries() { return Utils.getInt(props, "zk.read.num.retries", 3); } /** * If DefaultEventHandler is used, this specifies the number of times to retry if an error * is encountered during send. Currently, it is only appropriate when broker.list points to * a VIP. If the zk.connect option is used instead, this will not have any effect because * with the zk-based producer, brokers are not re-selected upon retry. So retries would go * to the same (potentially still down) broker. (KAFKA-253 will help address this.) * <br> * see https://github.com/apache/kafka/commit/d6b1de35f6b9cd5370c7812790fea8e61618f461 * @return times of producer retry */ public int getNumRetries() { return Utils.getInt(props, "num.retries", 0); } }