tdlib-session-container/src/main/java/it/tdlight/reactiveapi/kafka/KafkaProducer.java

79 lines
2.7 KiB
Java
Raw Normal View History

2022-10-04 12:43:24 +02:00
package it.tdlight.reactiveapi.kafka;
2022-01-13 01:59:26 +01:00
2022-10-04 12:43:24 +02:00
import it.tdlight.reactiveapi.ChannelCodec;
import it.tdlight.reactiveapi.EventProducer;
import it.tdlight.reactiveapi.KafkaParameters;
2022-01-13 01:59:26 +01:00
import java.util.HashMap;
import java.util.Map;
2022-03-21 01:08:12 +01:00
import java.util.logging.Level;
2022-01-13 01:59:26 +01:00
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.IntegerSerializer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
2022-03-21 01:08:12 +01:00
import reactor.core.publisher.SignalType;
2022-01-13 01:59:26 +01:00
import reactor.kafka.sender.KafkaSender;
import reactor.kafka.sender.SenderOptions;
import reactor.kafka.sender.SenderRecord;
2022-10-04 12:43:24 +02:00
public final class KafkaProducer<K> implements EventProducer<K> {
2022-01-13 01:59:26 +01:00
private static final Logger LOG = LogManager.getLogger(KafkaProducer.class);
2022-06-27 00:06:53 +02:00
private final KafkaSender<Integer, K> sender;
2022-10-04 12:43:24 +02:00
private final ChannelCodec channelCodec;
private final String channelName;
2022-01-13 01:59:26 +01:00
2022-10-04 12:43:24 +02:00
public KafkaProducer(KafkaParameters kafkaParameters, ChannelCodec channelCodec, String channelName) {
this.channelCodec = channelCodec;
this.channelName = channelName;
2022-01-13 01:59:26 +01:00
Map<String, Object> props = new HashMap<>();
2022-10-05 02:26:30 +02:00
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaParameters.getBootstrapServersString());
2022-01-13 01:59:26 +01:00
props.put(ProducerConfig.CLIENT_ID_CONFIG, kafkaParameters.clientId());
2022-09-13 22:15:18 +02:00
props.put(ProducerConfig.ACKS_CONFIG, "1");
props.put(ProducerConfig.BATCH_SIZE_CONFIG, Integer.toString(32 * 1024));
props.put(ProducerConfig.LINGER_MS_CONFIG, "20");
2022-09-07 15:29:46 +02:00
props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");
2022-01-13 01:59:26 +01:00
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class);
2022-09-22 15:46:31 +02:00
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, getChannelCodec().getSerializerClass());
2022-06-27 00:06:53 +02:00
SenderOptions<Integer, K> senderOptions = SenderOptions.create(props);
2022-01-13 01:59:26 +01:00
2022-01-13 11:20:44 +01:00
sender = KafkaSender.create(senderOptions.maxInFlight(1024));
2022-01-13 01:59:26 +01:00
}
2022-10-04 12:43:24 +02:00
@Override
public ChannelCodec getChannelCodec() {
return channelCodec;
}
2022-06-27 00:06:53 +02:00
2022-10-04 12:43:24 +02:00
@Override
public String getChannelName() {
return channelName;
}
2022-09-22 15:46:31 +02:00
2022-10-04 12:43:24 +02:00
@Override
2022-09-22 15:46:31 +02:00
public Mono<Void> sendMessages(Flux<K> eventsFlux) {
var channelName = getChannelName();
2022-01-13 01:59:26 +01:00
return eventsFlux
2022-09-22 15:46:31 +02:00
.<SenderRecord<Integer, K, Integer>>map(event ->
2022-09-22 16:26:55 +02:00
SenderRecord.create(new ProducerRecord<>("tdlib." + channelName, event), null))
2022-09-22 15:46:31 +02:00
.log("produce-messages-" + channelName,
2022-03-21 01:08:12 +01:00
Level.FINEST,
SignalType.REQUEST,
SignalType.ON_NEXT,
SignalType.ON_ERROR,
SignalType.ON_COMPLETE
)
2022-01-13 11:20:44 +01:00
.transform(sender::send)
2022-01-13 01:59:26 +01:00
.doOnError(e -> LOG.error("Send failed", e))
.then();
}
2022-10-04 12:43:24 +02:00
@Override
2022-01-13 01:59:26 +01:00
public void close() {
sender.close();
}
}