Skip to content

Commit 4dc5700

Browse files
Merge pull request #578 from folio-org/b17.4-CIRCSTORE-639
CIRCSTORE-654 Flush and close Kafka producer (backport to Sunflower)
2 parents dc9c670 + b08e504 commit 4dc5700

3 files changed

Lines changed: 43 additions & 17 deletions

File tree

NEWS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 17.4.4 2026-06-09
2+
* Flush and close Kafka producer (CIRCSTORE-654)
3+
14
## 17.4.3 2026-02-05
25
* Fix request status not updating upon check-in (CIRCSTORE-634)
36
* Fix missing request position (CIRCSTORE-635)

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<modelVersion>4.0.0</modelVersion>
33
<artifactId>mod-circulation-storage</artifactId>
44
<groupId>org.folio</groupId>
5-
<version>17.4.4-SNAPSHOT</version>
5+
<version>17.4.5-SNAPSHOT</version>
66
<licenses>
77
<license>
88
<name>Apache License 2.0</name>

src/main/java/org/folio/service/event/DomainEventPublisher.java

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.folio.service.event;
22

3+
import static io.vertx.core.Future.succeededFuture;
34
import static org.apache.logging.log4j.LogManager.getLogger;
4-
import static org.folio.service.event.EntityChangedEventPublisherFactory.requestEventPublisher;
55

66
import java.util.Map;
77

@@ -11,7 +11,6 @@
1111
import org.folio.kafka.SimpleKafkaProducerManager;
1212
import org.folio.kafka.services.KafkaEnvironmentProperties;
1313
import org.folio.kafka.services.KafkaProducerRecordBuilder;
14-
import org.folio.rest.jaxrs.model.Request;
1514
import org.folio.rest.tools.utils.TenantTool;
1615

1716
import io.vertx.core.Context;
@@ -42,27 +41,51 @@ public Future<Void> publish(K key, DomainEvent<T> event, Map<String, String> oka
4241
log.info("publish:: key = {}, eventId = {}, type = {}, topic = {}", key, event.getId(),
4342
event.getType(), kafkaTopic);
4443

45-
KafkaProducerRecord<K, String> producerRecord =
46-
new KafkaProducerRecordBuilder<K, DomainEvent<T>>(TenantTool.tenantId(okapiHeaders))
47-
.key(key)
48-
.value(event)
49-
.topic(kafkaTopic)
50-
.propagateOkapiHeaders(okapiHeaders)
51-
.build();
44+
KafkaProducerRecord<K, String> producerRecord = buildProducerRecord(key, event, okapiHeaders);
5245
log.info("publish:: kafkaRecord = [{}]", producerRecord);
5346

54-
KafkaProducer<K, String> producer = getOrCreateProducer();
55-
log.info("publish:: Producer created, sending the record...");
47+
KafkaProducer<K, String> producer = null;
48+
try {
49+
producer = getOrCreateProducer();
50+
log.info("publish:: Producer created, sending the record...");
51+
send(producer, key, producerRecord);
52+
} catch (Exception e) {
53+
log.error("publish:: Failed to initiate send for domain event with key [{}], kafka record [{}]",
54+
key, producerRecord, e);
55+
if (producer != null) {
56+
log.info("publish:: Producer is not null, trying to close. Event key: {}.", key);
57+
producer.close();
58+
}
59+
failureHandler.handle(e, producerRecord);
60+
}
61+
62+
return succeededFuture();
63+
}
64+
65+
private KafkaProducerRecord<K, String> buildProducerRecord(K key, DomainEvent<T> event,
66+
Map<String, String> okapiHeaders) {
67+
68+
return new KafkaProducerRecordBuilder<K, DomainEvent<T>>(TenantTool.tenantId(okapiHeaders))
69+
.key(key)
70+
.value(event)
71+
.topic(kafkaTopic)
72+
.propagateOkapiHeaders(okapiHeaders)
73+
.build();
74+
}
75+
76+
private void send(KafkaProducer<K, String> producer, K key,
77+
KafkaProducerRecord<K, String> producerRecord) {
5678

57-
return producer.send(producerRecord)
58-
.onSuccess(r -> log.info("publish:: Succeeded sending domain event with key [{}], " +
79+
producer.send(producerRecord)
80+
.onSuccess(r -> log.info("send:: Succeeded sending domain event with key [{}], " +
5981
"kafka record [{}]", key, producerRecord))
60-
.<Void>mapEmpty()
6182
.onFailure(cause -> {
62-
log.error("publish:: Unable to send domain event with key [{}], kafka record [{}]",
83+
log.error("send:: Unable to send domain event with key [{}], kafka record [{}]",
6384
key, producerRecord, cause);
6485
failureHandler.handle(cause, producerRecord);
65-
});
86+
})
87+
.eventually(() -> producer.flush())
88+
.eventually(() -> producer.close());
6689
}
6790

6891
private KafkaProducer<K, String> getOrCreateProducer() {

0 commit comments

Comments
 (0)