SpringApplicationEventPublisher.java

package com.github.jenkaby.bikerental.shared.infrastructure.messaging;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jspecify.annotations.NonNull;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Objects;

@Slf4j
@RequiredArgsConstructor
@Component
public class SpringApplicationEventPublisher implements EventPublisher {

    private final ApplicationEventPublisher eventPublisher;

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void publish(@NonNull String destination, @NonNull Object message) {
        Objects.requireNonNull(message, "message must not be null");
        Objects.requireNonNull(destination, "destination must not be null");

        log.info("Destination: '{}', publishing message: {}", destination, message);

        eventPublisher.publishEvent(message);
    }
}