![JAR search and dependency download from the Maven repository](/logo.png)
org.zalando.nakadiproducer.transmission.impl.EventTransmissionService Maven / Gradle / Ivy
package org.zalando.nakadiproducer.transmission.impl;
import static java.time.temporal.ChronoUnit.MINUTES;
import static java.util.Collections.singletonList;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.time.Instant;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.UUID;
import javax.transaction.Transactional;
import org.zalando.nakadiproducer.eventlog.impl.EventLog;
import org.zalando.nakadiproducer.eventlog.impl.EventLogRepository;
import org.zalando.nakadiproducer.transmission.NakadiPublishingClient;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@Slf4j
public class EventTransmissionService {
private EventLogRepository eventLogRepository;
private NakadiPublishingClient nakadiPublishingClient;
private ObjectMapper objectMapper;
public EventTransmissionService(EventLogRepository eventLogRepository, NakadiPublishingClient nakadiPublishingClient, ObjectMapper objectMapper) {
this.eventLogRepository = eventLogRepository;
this.nakadiPublishingClient = nakadiPublishingClient;
this.objectMapper = objectMapper;
}
@Transactional
public Collection lockSomeEvents() {
String lockId = UUID.randomUUID().toString();
log.debug("Locking events for replication with lockId {}", lockId);
eventLogRepository.lockSomeMessages(lockId, Instant.now(), Instant.now().plus(10, MINUTES));
return eventLogRepository.findByLockedByAndLockedUntilGreaterThan(lockId, Instant.now());
}
@Transactional
public void sendEvent(EventLog eventLog) {
try {
nakadiPublishingClient.publish(eventLog.getEventType(), singletonList(mapToNakadiEvent(eventLog)));
log.info("Event {} locked by {} was sucessfully transmitted to nakadi", eventLog.getId(), eventLog.getLockedBy());
eventLogRepository.delete(eventLog);
} catch (Exception e) {
log.error("Event {} locked by {} could not be transmitted to nakadi: {}", eventLog.getId(), eventLog.getLockedBy(), e.getMessage());
}
}
public NakadiEvent mapToNakadiEvent(final EventLog event) {
final NakadiEvent nakadiEvent = new NakadiEvent();
final NakadiMetadata metadata = new NakadiMetadata();
metadata.setEid(convertToUUID(event.getId()));
metadata.setOccuredAt(event.getCreated());
nakadiEvent.setMetadata(metadata);
HashMap payloadDTO;
try {
payloadDTO = objectMapper.readValue(event.getEventBodyData(), new TypeReference>() { });
} catch (IOException e) {
log.error("An error occurred at JSON deserialization", e);
throw new UncheckedIOException(e);
}
nakadiEvent.setData(payloadDTO);
return nakadiEvent;
}
/**
* Converts a number in UUID format.
*
* For instance 213 will be converted to "00000000-0000-0000-0000-0000000000d5"
*/
private String convertToUUID(final int number) {
return new UUID(0, number).toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy