Simple event bus
Step 1: Create the Event Bus
public class OfferSavedEvent {
private final String offerId;
// other relevant fields and methods
public OfferSavedEvent(String offerId) {
this.offerId = offerId;
}
public String getOfferId() {
return offerId;
}
}
Step 2: Create the Event Bus Interface
public interface EventBus {
void publish(OfferSavedEvent event);
void subscribe(Consumer<OfferSavedEvent> eventHandler);
void unsubscribe(Consumer<OfferSavedEvent> eventHandler);
}
Step 3: Implement the Event Bus
Create a class that implements the EventBus interface and uses a simple list of event handlers to publish and subscribe to events:
@Component
public class SimpleEventBus implements EventBus {
private final List<Consumer<OfferSavedEvent>> eventHandlers = new ArrayList<>();
@Override
public void publish(OfferSavedEvent event) {
for (Consumer<OfferSavedEvent> eventHandler : eventHandlers) {
eventHandler.accept(event);
}
}
@Override
public void subscribe(Consumer<OfferSavedEvent> eventHandler) {
eventHandlers.add(eventHandler);
}
@Override
public void unsubscribe(Consumer<OfferSavedEvent> eventHandler) {
eventHandlers.remove(eventHandler);
}
}
Step 4: Emit the Domain Event
@Service
public class OfferService {
private final EventBus eventBus;
public OfferService(EventBus eventBus) {
this.eventBus = eventBus;
}
public void save(Offer offer) {
// Save the offer
// Emit the domain event
OfferSavedEvent event = new OfferSavedEvent(offer.getId());
eventBus.publish(event);
}
}
Step 5: Subscribe to the Domain Event
@Component
public class OfferSavedEventSubscriber {
private final EventBus eventBus;
public OfferSavedEventSubscriber(EventBus eventBus) {
this.eventBus = eventBus;
eventBus.subscribe(this::handleOfferSavedEvent);
}
public void handleOfferSavedEvent(OfferSavedEvent event) {
// Perform necessary actions based on the event
System.out.println("Received OfferSavedEvent: " + event.getOfferId());
}
}