我有一个生成数据的Kafka生产者类 每次初始化连接,这是一个耗时的过程, 所以为了让它更快,我想实现Kafka连接 池。我搜索了大量的解决方案,但没有找到合适的 one。请将我重定向到正确的解决方案。谢谢。我的卡夫卡制片人 上课是:
import java.util.Properties;
import org.apache.log4j.Logger;
import com.bisil.report.queue.QueueDBFeederService;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
@SuppressWarnings("deprecation")
public class KafkaProducer1 implements ProducerService {
private static Producer<Integer, String> producer;
private static final String topic= "mytopic1";
private Logger logger = Logger.getLogger(KafkaProducer1.class);
@Override
public void initialize() {
try {
Properties producerProps = new Properties();
producerProps.put("metadata.broker.list", "192.168.21.182:9092");
producerProps.put("serializer.class", "kafka.serializer.StringEncoder");
producerProps.put("request.required.acks", "1");
ProducerConfig producerConfig = new ProducerConfig(producerProps);
producer = new Producer<Integer, String>(producerConfig);
} catch (Exception e) {
logger.error("Exception while sending data to server "+e,e);
}
logger.info("Test Message");
}
@Override
public void publishMessage(String jsonPacket) {
KeyedMessage<Integer, String> keyedMsg = new KeyedMessage<Integer, String >(topic, jsonPacket);
producer.send(keyedMsg);
// This publishes message on given topic
}
@Override
public void callMessage(String jsonPacket){
initialize();
// Publish message
publishMessage(jsonPacket);
//Close the producer
producer.close();
}
}
答案 0 :(得分:0)
您可以将所有消息放入数组中,迭代地将其发布到主题,然后在完成后关闭生产者。这样只会进行一次初始化和一次关闭或销毁。您可以执行类似这样的操作
String[] jsonPacket/// your message array
for (long i = 0; i < jsonPacket.length; i++) {
producer.send(new KeyedMessage<Integer, String>(topic, jsonPacket[i]));
}
producer.close();
答案 1 :(得分:0)
如果我的理解是正确的,您需要生成器对象池,当新的发布请求发生时可以始终可用,并在任务完成时等待其他请求,您的需求可能与“对象池”匹配(带有执行程序的对象工厂) java中的框架工作(池)由Apache commons实现,因为您需要从池中获取KafkaProducer对象。在apache commons jar中实现并可用的对象池概念。 https://dzone.com/articles/creating-object-pool-java