/** * Publish event {@code event}. * * @param event event * @return published event */ @SuppressWarnings("unchecked") public <T> T publish(T event) { if (event == null) { throw new IllegalArgumentException("Null event."); } final Class<?> eventClass = event.getClass(); for (Class<?> clazz : typeCache[eventClass.hashCode() & CACHE_MASK].getUnchecked(eventClass)) { final Set<EventSubscriber> eventSubscribers = subscribersByEventType.get(clazz); if (eventSubscribers != null && !eventSubscribers.isEmpty()) { for (EventSubscriber eventSubscriber : eventSubscribers) { try { LOG.debug("Publish event {} for {}", event, eventSubscriber); eventSubscriber.onEvent(event); } catch (RuntimeException e) { LOG.error(e.getMessage(), e); } } } } return event; }