use of io.micronaut.jms.model.JMSDestinationType in project micronaut-jms by micronaut-projects.
the class AbstractJMSListenerMethodProcessor method registerListener.
private void registerListener(ExecutableMethod<?, ?> method, String connectionFactoryName, BeanDefinition<?> beanDefinition, AnnotationValue<T> destinationAnnotation, JMSDestinationType type) {
validateArguments(method);
final Class<?> targetClass = Stream.of(method.getArguments()).filter(arg -> arg.isDeclaredAnnotationPresent(MessageBody.class) || arg.isDeclaredAnnotationPresent(io.micronaut.jms.annotations.Message.class)).findAny().map(Argument::getClass).get();
final String destination = destinationAnnotation.getRequiredValue(String.class);
final int acknowledgeMode = destinationAnnotation.getRequiredValue("acknowledgeMode", Integer.class);
final boolean transacted = destinationAnnotation.getRequiredValue("transacted", Boolean.class);
final JMSListenerContainerFactory listenerFactory = beanContext.findBean(JMSListenerContainerFactory.class).orElseThrow(() -> new IllegalStateException("No JMSListenerFactory configured"));
final JMSConnectionPool connectionPool = beanContext.getBean(JMSConnectionPool.class, Qualifiers.byName(connectionFactoryName));
final Object bean = beanContext.findBean(beanDefinition.getBeanType()).get();
final ExecutorService executor = getExecutorService(destinationAnnotation);
MessageListener listener = generateAndBindListener(bean, method, executor, CLIENT_ACKNOWLEDGE == acknowledgeMode);
listenerFactory.registerListener(connectionPool, destination, listener, targetClass, transacted, acknowledgeMode, type);
}
use of io.micronaut.jms.model.JMSDestinationType in project micronaut-jms by micronaut-projects.
the class JMSProducerMethodInterceptor method intercept.
@Override
public Object intercept(MethodInvocationContext<Object, Object> context) {
if (!context.hasAnnotation(JMSProducer.class)) {
return context.proceed();
}
ExecutableMethod<?, ?> method = context.getExecutableMethod();
Class<? extends Annotation> annotationType;
JMSDestinationType destinationType;
if (method.hasAnnotation(Queue.class)) {
annotationType = Queue.class;
destinationType = QUEUE;
} else if (method.hasAnnotation(Topic.class)) {
annotationType = Topic.class;
destinationType = TOPIC;
} else {
return context.proceed();
}
String connectionFactory = method.stringValue(JMSProducer.class).orElseThrow(() -> new ConfigurationException("@JMSProducer must specify a connection factory."));
String destinationName = method.stringValue(annotationType).orElseThrow(() -> new ConfigurationException("@" + annotationType.getSimpleName() + " must specify a destination."));
Map<String, Object> parameterValueMap = context.getParameterValueMap();
Object body = Arrays.stream(method.getArguments()).filter(arg -> arg.isDeclaredAnnotationPresent(MessageBody.class)).map(arg -> parameterValueMap.get(arg.getName())).findFirst().orElseThrow(() -> new ConfigurationException("One method argument must be annotated with @Body"));
String serializerName = method.stringValue(annotationType, "serializer").orElse(null);
Serializer serializer = serializerName == null ? beanContext.getBean(DefaultSerializerDeserializer.class) : beanContext.getBean(Serializer.class, Qualifiers.byName(serializerName));
MessageHeader[] headers = Arrays.stream(method.getArguments()).filter(arg -> arg.isDeclaredAnnotationPresent(io.micronaut.messaging.annotation.MessageHeader.class)).map(arg -> {
String argName = arg.getName();
String headerName = arg.getAnnotationMetadata().stringValue(io.micronaut.messaging.annotation.MessageHeader.class).orElseThrow(() -> new IllegalArgumentException("@Header annotation on argument '" + argName + "' must have a name"));
return new MessageHeader(headerName, parameterValueMap.get(argName));
}).toArray(MessageHeader[]::new);
JMSConnectionPool pool = beanContext.getBean(JMSConnectionPool.class, Qualifiers.byName(connectionFactory));
JmsProducer producer = new JmsProducer(destinationType, pool, serializer);
producer.send(destinationName, body, headers);
return null;
}
Aggregations