io.smallrye.reactive.messaging.providers.extension.ReactiveMessagingExtension Maven / Gradle / Ivy
package io.smallrye.reactive.messaging.providers.extension;
import static io.smallrye.reactive.messaging.providers.i18n.ProviderLogging.log;
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.Flow;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.Instance;
import jakarta.enterprise.inject.spi.*;
import jakarta.inject.Inject;
import org.eclipse.microprofile.reactive.messaging.*;
import org.eclipse.microprofile.reactive.streams.operators.PublisherBuilder;
import org.reactivestreams.Publisher;
import io.smallrye.reactive.messaging.EmitterConfiguration;
import io.smallrye.reactive.messaging.EmitterFactory;
import io.smallrye.reactive.messaging.EmitterType;
import io.smallrye.reactive.messaging.annotations.Blocking;
import io.smallrye.reactive.messaging.annotations.Broadcast;
import io.smallrye.reactive.messaging.annotations.EmitterFactoryFor;
import io.smallrye.reactive.messaging.annotations.Incomings;
import io.smallrye.reactive.messaging.providers.DefaultEmitterConfiguration;
import io.smallrye.reactive.messaging.providers.connectors.WorkerPoolRegistry;
import io.smallrye.reactive.messaging.providers.i18n.ProviderExceptions;
public class ReactiveMessagingExtension implements Extension {
private final List> mediatorBeans = new ArrayList<>();
private final List streamInjectionPoints = new ArrayList<>();
private final Map emitterInjectionPoints = new HashMap();
private final List> emitterFactoryBeans = new ArrayList<>();
private final List> workerPoolBeans = new ArrayList<>();
@Inject
HealthCenter health;
void processClassesContainingMediators(@Observes ProcessManagedBean event) {
AnnotatedType annotatedType = event.getAnnotatedBeanClass();
if (annotatedType.getMethods()
.stream()
.anyMatch(m -> m.isAnnotationPresent(Incomings.class) || m.isAnnotationPresent(Incoming.class)
|| m.isAnnotationPresent(Outgoing.class))) {
mediatorBeans.add(new MediatorBean<>(event.getBean(), event.getAnnotatedBeanClass()));
}
}
> void processEmitterFactories(
@Observes @WithAnnotations({ EmitterFactoryFor.class }) ProcessAnnotatedType event) {
AnnotatedType annotatedType = event.getAnnotatedType();
emitterFactoryBeans.add(new EmitterFactoryBean<>(annotatedType));
}
void processBlockingAnnotation(@Observes @WithAnnotations({ Blocking.class }) ProcessAnnotatedType event) {
AnnotatedType annotatedType = event.getAnnotatedType();
workerPoolBeans.add(new WorkerPoolBean<>(annotatedType));
}
> void processStreamPublisherInjectionPoint(@Observes ProcessInjectionPoint pip) {
Channel stream = ChannelProducer.getChannelQualifier(pip.getInjectionPoint());
if (stream != null) {
streamInjectionPoints.add(pip.getInjectionPoint());
}
}
> void processStreamReactiveStreamPublisherInjectionPoint(
@Observes ProcessInjectionPoint pip) {
Channel stream = ChannelProducer.getChannelQualifier(pip.getInjectionPoint());
if (stream != null) {
streamInjectionPoints.add(pip.getInjectionPoint());
}
}
void processStreamSpecEmitterInjectionPoint(@Observes ProcessInjectionPoint> pip) {
Channel stream = ChannelProducer.getChannelQualifier(pip.getInjectionPoint());
if (stream != null) {
EmitterFactoryFor emitterType = emitterType(pip.getInjectionPoint(), emitterFactoryBeans);
if (emitterType != null) {
emitterInjectionPoints.put(pip.getInjectionPoint(), emitterType);
}
}
}
void processStreamEmitterInjectionPoint(@Observes ProcessInjectionPoint pip) {
Channel stream = ChannelProducer.getChannelQualifier(pip.getInjectionPoint());
if (stream != null) {
EmitterFactoryFor emitterType = emitterType(pip.getInjectionPoint(), emitterFactoryBeans);
if (emitterType != null) {
emitterInjectionPoints.put(pip.getInjectionPoint(), emitterType);
}
}
}
> void processStreamPublisherBuilderInjectionPoint(
@Observes ProcessInjectionPoint pip) {
Channel stream = ChannelProducer.getChannelQualifier(pip.getInjectionPoint());
if (stream != null) {
streamInjectionPoints.add(pip.getInjectionPoint());
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
void afterDeploymentValidation(@Observes AfterDeploymentValidation done, BeanManager beanManager) {
Instance