Skip to content

Instantly share code, notes, and snippets.

@AdrianoJS
Last active September 15, 2023 20:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AdrianoJS/39ca1a7c7c3ca0cb25a6e56d9f0692b8 to your computer and use it in GitHub Desktop.
Save AdrianoJS/39ca1a7c7c3ca0cb25a6e56d9f0692b8 to your computer and use it in GitHub Desktop.
public class HibernateCDCEventListener implements PostDeleteEventListener, PostUpdateEventListener, PostInsertEventListener {
private transient EventMessageSender eventMessageSender;
public HibernateCDCEventListener(final EntityManagerFactory entityManagerFactory,
final EventMessageSender eventMessageSender) {
SessionFactoryImplementor sessionFactory = entityManagerFactory.unwrap(SessionFactoryImplementor.class);
EventListenerRegistry eventListenerRegistry = sessionFactory.getServiceRegistry()
.getService(EventListenerRegistry.class);
eventListenerRegistry.appendListeners(POST_DELETE, this);
eventListenerRegistry.appendListeners(POST_UPDATE, this);
eventListenerRegistry.appendListeners(POST_INSERT, this);
this.eventMessageSender = eventMessageSender;
}
@Override
public void onPostDelete(final PostDeleteEvent event) {
// Handle delete events
}
@Override
public void onPostInsert(final PostInsertEvent event) {
processEntity(event.getEntity(), event.getEntity(), event.getEntity());
}
@Override
public void onPostUpdate(final PostUpdateEvent event) {
processEntity(event.getEntity(), event.getEntity(), event.getEntity());
}
@Override
public boolean requiresPostCommitHanding(final EntityPersister persister) {
return false;
}
public void setEventMessageSender(final EventMessageSender eventMessageSender) {
this.eventMessageSender = eventMessageSender;
}
private void createDataEvent(final Object entity, Set<String> dirtyProperties) {
if (dirtyProperties.isEmpty()) {
return;
}
if (entity instanceof Baz) {
BazEventHandler.createDataEventMessage((Baz) entity, dirtyProperties);
} else if (entity instanceof Qux) {
QuuxEventHandler.createDataEventMessage((Qux) entity);
} else if (entity instanceof Quux) {
QuuxEventHandler.createDataEventMessage((Quux) entity);
} else if (entity instanceof Corge) {
CorgeEventHandler.createDataEventMessage((Corge) entity);
} else if (entity instanceof Grault) {
GraultEventHandler.createDataEventMessage((Grault) entity);
} else if (entity instanceof Waldo) {
WaldoEventHandler.createDataEventMessage((Waldo) entity);
}
sendEventsBeforeCommit();
}
private void createDeleteDataEvent(final Object entity) {
if (entity instanceof Baz) {
BazEventHandler.createDeleteEvent((Baz) entity);
} else if (entity instanceof Qux) {
QuxEventHandler.createDeleteEvent((Qux) entity);
} else if (entity instanceof Quux) {
QuuxEventHandler.createDeleteEvent((Quux) entity);
}
sendEventsBeforeCommit();
}
private void processEntity(final Object event, final Object event1, final Object event2) {
if (shouldProcessEntity(event)) {
createDataEvent(event1, getCdcFields(event2.getClass()));
}
}
private void sendEventsBeforeCommit() {
TransactionSynchronizationManager.registerSynchronization(eventMessageSender);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment