All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codegas.commons.domain.event.DomainEventPublisher Maven / Gradle / Ivy

package org.codegas.commons.domain.event;

import java.util.ArrayList;
import java.util.List;

public class DomainEventPublisher {

    private static final ThreadLocal LOCAL_PUBLISHER = ThreadLocal.withInitial(DomainEventPublisher::new);

    private final List subscribers = new ArrayList<>();

    private boolean publishing;

    private DomainEventPublisher() {

    }

    public static DomainEventPublisher instance() {
        return LOCAL_PUBLISHER.get();
    }

    public void reset() {
        if (!publishing) {
            subscribers.clear();
        }
    }

    public  void subscribe(DomainEventSubscriber subscriber) {
        if (!publishing) {
            subscribers.add(subscriber);
        }
    }

    public  void publish(T domainEvent) {
        if (!publishing && !subscribers.isEmpty()) {
            try {
                publishing = true;
                for (DomainEventSubscriber subscriber : subscribers) {
                    Class subscribedEventType = subscriber.getSubscribedEventType();
                    if (subscribedEventType.isAssignableFrom(domainEvent.getClass())) {
                        subscriber.handleEvent(domainEvent);
                    }
                }
            } finally {
                publishing = false;
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy