diff --git a/README.md b/README.md index 46f3fd2..fe5c89d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # cdcdemo -This project is a simple test of CDC design pattern using Hibernate listeners and Observes bean +This project is a simple test of CDC design pattern using Observes This project uses Quarkus, the Supersonic Subatomic Java Framework. diff --git a/src/main/java/org/acme/EventCollector.java b/src/main/java/org/acme/EventCollector.java deleted file mode 100644 index 40a5b65..0000000 --- a/src/main/java/org/acme/EventCollector.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.acme; - -import jakarta.enterprise.context.RequestScoped; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Stream; - -@RequestScoped -public class EventCollector { - private final Map> cache; - - public EventCollector() { - cache = new HashMap<>(); - } - - public void register(String type, CollectEvent event) { - if (!cache.containsKey(type)) { - cache.put(type, new ArrayList<>()); - } - cache.get(type).add(event); - } - - public Stream stream(String type) { - return cache.get(type).stream(); - } - -} diff --git a/src/main/java/org/acme/HibernateEventListenerIntegrator.java b/src/main/java/org/acme/HibernateEventListenerIntegrator.java deleted file mode 100644 index 6ea5964..0000000 --- a/src/main/java/org/acme/HibernateEventListenerIntegrator.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.acme; - -import io.quarkus.runtime.Startup; -import jakarta.enterprise.context.ApplicationScoped; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.spi.BootstrapContext; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.event.service.spi.EventListenerRegistry; -import org.hibernate.event.spi.EventType; -import org.hibernate.integrator.spi.Integrator; -import org.hibernate.service.spi.SessionFactoryServiceRegistry; -import org.jboss.logging.Logger; - -@Startup -@ApplicationScoped -public class HibernateEventListenerIntegrator implements Integrator { - private final Logger log = Logger.getLogger(HibernateEventListenerIntegrator.class); - - @Override - public void integrate(Metadata metadata, BootstrapContext bootstrapContext, SessionFactoryImplementor sessionFactory) { - log.info("Integrate registry"); - EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class); - registry.appendListeners(EventType.POST_COMMIT_INSERT, UserEventListener.class); - registry.appendListeners(EventType.POST_COMMIT_UPDATE, UserEventListener.class); - registry.appendListeners(EventType.POST_COMMIT_DELETE, UserEventListener.class); - } - - @Override - public void disintegrate(SessionFactoryImplementor sessionFactoryImplementor, SessionFactoryServiceRegistry sessionFactoryServiceRegistry) { - } - -} diff --git a/src/main/java/org/acme/UserEventListener.java b/src/main/java/org/acme/UserEventListener.java deleted file mode 100644 index f146b43..0000000 --- a/src/main/java/org/acme/UserEventListener.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.acme; - -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import org.hibernate.event.spi.*; -import org.hibernate.persister.entity.EntityPersister; -import org.jboss.logging.Logger; - -import java.util.List; -import java.util.stream.Collectors; - -@ApplicationScoped -public class UserEventListener implements PostCommitInsertEventListener, PostCommitUpdateEventListener, PostCommitDeleteEventListener { - private final Logger log = Logger.getLogger(UserEventListener.class); - private final EventCollector eventCollector; - - @Inject - public UserEventListener(EventCollector eventCollector) { - this.eventCollector = eventCollector; - } - - @Override - public void onPostInsert(PostInsertEvent postInsertEvent) { - log.info("onPostInsert called"); - List events = eventCollector.stream(User.class.getCanonicalName()) - .filter(it -> it.getType() == CollectEvent.Type.CREATION) - .collect(Collectors.toUnmodifiableList()); - - log.info("fire " + events.size() + " events"); - } - - @Override - public void onPostUpdate(PostUpdateEvent postUpdateEvent) { - log.info("onPostUpdate called"); - List events = eventCollector.stream(User.class.getCanonicalName()) - .filter(it -> it.getType() == CollectEvent.Type.UPDATE) - .collect(Collectors.toUnmodifiableList()); - - log.info("fire " + events.size() + " events"); - } - - @Override - public void onPostDelete(PostDeleteEvent postDeleteEvent) { - log.info("onPostDelete called"); - List events = eventCollector.stream(User.class.getCanonicalName()) - .filter(it -> it.getType() == CollectEvent.Type.DELETE) - .collect(Collectors.toUnmodifiableList()); - - log.info("fire " + events.size() + " events"); - } - - @Override - public boolean requiresPostCommitHandling(EntityPersister entityPersister) { - return true; - } - - @Override - public void onPostDeleteCommitFailed(PostDeleteEvent postDeleteEvent) { - log.info("onPostDeleteCommitFailed called"); - } - - @Override - public void onPostInsertCommitFailed(PostInsertEvent postInsertEvent) { - log.info("onPostInsertCommitFailed called"); - } - - @Override - public void onPostUpdateCommitFailed(PostUpdateEvent postUpdateEvent) { - log.info("onPostUpdateCommitFailed called"); - } - -} diff --git a/src/main/java/org/acme/UserObserver.java b/src/main/java/org/acme/UserObserver.java index dc75560..c626898 100644 --- a/src/main/java/org/acme/UserObserver.java +++ b/src/main/java/org/acme/UserObserver.java @@ -3,28 +3,18 @@ package org.acme; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; import jakarta.enterprise.event.TransactionPhase; -import jakarta.inject.Inject; import org.jboss.logging.Logger; @ApplicationScoped public class UserObserver { private final Logger log = Logger.getLogger(UserObserver.class); - private final EventCollector eventCollector; - - @Inject - public UserObserver(EventCollector eventCollector) { - this.eventCollector = eventCollector; - } - public void onCreation(@Observes(during = TransactionPhase.AFTER_SUCCESS) UserCreated event) { log.info("Arrived event for user " + event.getUsername()); - eventCollector.register(User.class.getCanonicalName(), event); } public void onDelete(@Observes(during = TransactionPhase.AFTER_SUCCESS) UserDeleted event) { log.info("Arrived event for deletion user " + event.getId()); - eventCollector.register(User.class.getCanonicalName(), event); } }