/** * Create an empty {@link MessagingMessageListenerAdapter} instance. * @return the {@link MessagingMessageListenerAdapter} instance. */ protected MessagingMessageListenerAdapter createMessageListenerInstance() { return new MessagingMessageListenerAdapter(this.bean, this.method, this.returnExceptions, this.errorHandler); }
protected Message<?> toMessagingMessage(org.springframework.amqp.core.Message amqpMessage) { return (Message<?>) getMessagingMessageConverter().fromMessage(amqpMessage); }
@Override public void onMessage(org.springframework.amqp.core.Message amqpMessage, Channel channel) throws Exception { // NOSONAR Message<?> message = toMessagingMessage(amqpMessage); if (logger.isDebugEnabled()) { logger.debug("Processing [" + message + "]"); result = invokeHandler(amqpMessage, channel, message); if (result.getReturnValue() != null) { handleResult(result, amqpMessage, channel, message); Object errorResult = this.errorHandler.handleError(amqpMessage, message, e); if (errorResult != null) { handleResult(new InvocationResult(errorResult, null, null), amqpMessage, channel, message); returnOrThrow(amqpMessage, channel, message, ex, ex); returnOrThrow(amqpMessage, channel, message, e.getCause(), e);
@SuppressWarnings("deprecation") @Override protected MessagingMessageListenerAdapter createMessageListener(MessageListenerContainer container) { Assert.state(this.messageHandlerMethodFactory != null, "Could not create message listener - MessageHandlerMethodFactory not set"); MessagingMessageListenerAdapter messageListener = createMessageListenerInstance(); messageListener.setHandlerAdapter(configureListenerAdapter(messageListener)); String replyToAddress = getDefaultReplyToAddress(); if (replyToAddress != null) { messageListener.setResponseAddress(replyToAddress); } MessageConverter messageConverter = getMessageConverter(); if (messageConverter == null) { // fall back to the legacy converter holder in the container messageConverter = container.getMessageConverter(); } if (messageConverter != null) { messageListener.setMessageConverter(messageConverter); } if (getBeanResolver() != null) { messageListener.setBeanResolver(getBeanResolver()); } return messageListener; }
protected MessagingMessageListenerAdapter createInstance(Method m, boolean returnExceptions) { MessagingMessageListenerAdapter adapter = new MessagingMessageListenerAdapter(null, m, returnExceptions, null); adapter.setHandlerAdapter(new HandlerAdapter(factory.createInvocableHandlerMethod(sample, m))); return adapter; }
@Test public void genericMessageTest2() throws Exception { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("{ \"foo\" : \"bar\" }"); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("withGenericMessageFooType", Message.class); listener.setMessageConverter(new Jackson2JsonMessageConverter()); message.getMessageProperties().setContentType("application/json"); listener.onMessage(message, channel); assertEquals(Foo.class, this.sample.payload.getClass()); }
@Test public void processAndReplyWithMessage() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(org.springframework.amqp.core.Message.class); listener.setMessageConverter(null); listener.setResponseExchange("fooQueue"); String body = "echo text"; org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage(body, new MessageProperties()); processAndReply(listener, message, "fooQueue", "", false, null); assertDefaultListenerMethodInvocation(); }
@Override protected Object extractPayload(org.springframework.amqp.core.Message message) { MessageProperties messageProperties = message.getMessageProperties(); if (this.bean != null) { messageProperties.setTargetBean(this.bean); } if (this.method != null) { messageProperties.setTargetMethod(this.method); if (this.inferredArgumentType != null) { messageProperties.setInferredArgumentType(this.inferredArgumentType); } } return extractMessage(message); }
private void returnOrThrow(org.springframework.amqp.core.Message amqpMessage, Channel channel, Message<?> message, Throwable throwableToReturn, Exception exceptionToThrow) throws Exception { // NOSONAR if (!this.returnExceptions) { throw exceptionToThrow; } try { handleResult(new InvocationResult(new RemoteInvocationResult(throwableToReturn), null, null), amqpMessage, channel, message); } catch (ReplyFailureException rfe) { if (void.class.equals(this.handlerAdapter.getReturnType(message.getPayload()))) { throw exceptionToThrow; } else { throw rfe; } } }
/** * Invoke the handler, wrapping any exception to a {@link ListenerExecutionFailedException} * with a dedicated error message. * @param amqpMessage the raw message. * @param channel the channel. * @param message the messaging message. * @return the result of invoking the handler. */ private InvocationResult invokeHandler(org.springframework.amqp.core.Message amqpMessage, Channel channel, Message<?> message) { try { return this.handlerAdapter.invoke(message, amqpMessage, channel); } catch (MessagingException ex) { throw new ListenerExecutionFailedException(createMessagingErrorMessage("Listener method could not " + "be invoked with the incoming message", message.getPayload()), ex, amqpMessage); } catch (Exception ex) { throw new ListenerExecutionFailedException("Listener method '" + this.handlerAdapter.getMethodAsString(message.getPayload()) + "' threw exception", ex, amqpMessage); } }
/** * Build a Rabbit message to be sent as response based on the given result object. * @param channel the Rabbit Channel to operate on * @param result the content of the message, as returned from the listener method * @param genericType the generic type of the result. * @return the Rabbit <code>Message</code> (never <code>null</code>) * @see #setMessageConverter */ @Override protected org.springframework.amqp.core.Message buildMessage(Channel channel, Object result, Type genericType) { MessageConverter converter = getMessageConverter(); if (converter != null && !(result instanceof org.springframework.amqp.core.Message)) { if (result instanceof org.springframework.messaging.Message) { return this.messagingMessageConverter.toMessage(result, new MessageProperties()); } else { return converter.toMessage(result, new MessageProperties(), genericType); } } else { if (!(result instanceof org.springframework.amqp.core.Message)) { throw new MessageConversionException("No MessageConverter specified - cannot handle message [" + result + "]"); } return (org.springframework.amqp.core.Message) result; } }
@SuppressWarnings("deprecation") @Override protected MessagingMessageListenerAdapter createMessageListener(MessageListenerContainer container) { Assert.state(this.messageHandlerMethodFactory != null, "Could not create message listener - MessageHandlerMethodFactory not set"); MessagingMessageListenerAdapter messageListener = createMessageListenerInstance(); messageListener.setHandlerAdapter(configureListenerAdapter(messageListener)); String replyToAddress = getDefaultReplyToAddress(); if (replyToAddress != null) { messageListener.setResponseAddress(replyToAddress); } MessageConverter messageConverter = getMessageConverter(); if (messageConverter == null) { // fall back to the legacy converter holder in the container messageConverter = container.getMessageConverter(); } if (messageConverter != null) { messageListener.setMessageConverter(messageConverter); } if (getBeanResolver() != null) { messageListener.setBeanResolver(getBeanResolver()); } return messageListener; }
protected MessagingMessageListenerAdapter createMultiInstance(Method m1, Method m2, boolean returnExceptions) { MessagingMessageListenerAdapter adapter = new MessagingMessageListenerAdapter(null, null, returnExceptions, null); List<InvocableHandlerMethod> methods = new ArrayList<>(); methods.add(this.factory.createInvocableHandlerMethod(sample, m1)); methods.add(this.factory.createInvocableHandlerMethod(sample, m2)); DelegatingInvocableHandler handler = new DelegatingInvocableHandler(methods, this.sample, null, null); adapter.setHandlerAdapter(new HandlerAdapter(handler)); return adapter; }
@Test public void genericMessageTest3() throws Exception { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("{ \"foo\" : \"bar\" }"); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("withNonGenericMessage", Message.class); listener.setMessageConverter(new Jackson2JsonMessageConverter()); message.getMessageProperties().setContentType("application/json"); listener.onMessage(message, channel); assertEquals(LinkedHashMap.class, this.sample.payload.getClass()); }
@Test public void processAndReplyWithMessageAndStringReply() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(org.springframework.amqp.core.Message.class); listener.setMessageConverter(null); listener.setResponseExchange("fooQueue"); String body = "echo text"; org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage(body, new MessageProperties()); try { processAndReply(listener, message, "fooQueue", "", false, null); fail("Should have fail. Not converter and the reply is not a message"); } catch (ReplyFailureException ex) { Throwable cause = ex.getCause(); assertNotNull(cause); assertEquals(MessageConversionException.class, cause.getClass()); assertTrue(ex.getMessage().contains("foo")); // exception holds the content of the reply } assertDefaultListenerMethodInvocation(); }
@Override protected Object extractPayload(org.springframework.amqp.core.Message message) { MessageProperties messageProperties = message.getMessageProperties(); if (this.bean != null) { messageProperties.setTargetBean(this.bean); } if (this.method != null) { messageProperties.setTargetMethod(this.method); if (this.inferredArgumentType != null) { messageProperties.setInferredArgumentType(this.inferredArgumentType); } } return extractMessage(message); }
private void returnOrThrow(org.springframework.amqp.core.Message amqpMessage, Channel channel, Message<?> message, Throwable throwableToReturn, Exception exceptionToThrow) throws Exception { // NOSONAR if (!this.returnExceptions) { throw exceptionToThrow; } try { handleResult(new InvocationResult(new RemoteInvocationResult(throwableToReturn), null, null), amqpMessage, channel, message); } catch (ReplyFailureException rfe) { if (void.class.equals(this.handlerAdapter.getReturnType(message.getPayload()))) { throw exceptionToThrow; } else { throw rfe; } } }
/** * Invoke the handler, wrapping any exception to a {@link ListenerExecutionFailedException} * with a dedicated error message. * @param amqpMessage the raw message. * @param channel the channel. * @param message the messaging message. * @return the result of invoking the handler. */ private InvocationResult invokeHandler(org.springframework.amqp.core.Message amqpMessage, Channel channel, Message<?> message) { try { return this.handlerAdapter.invoke(message, amqpMessage, channel); } catch (MessagingException ex) { throw new ListenerExecutionFailedException(createMessagingErrorMessage("Listener method could not " + "be invoked with the incoming message", message.getPayload()), ex, amqpMessage); } catch (Exception ex) { throw new ListenerExecutionFailedException("Listener method '" + this.handlerAdapter.getMethodAsString(message.getPayload()) + "' threw exception", ex, amqpMessage); } }
/** * Build a Rabbit message to be sent as response based on the given result object. * @param channel the Rabbit Channel to operate on * @param result the content of the message, as returned from the listener method * @param genericType the generic type of the result. * @return the Rabbit <code>Message</code> (never <code>null</code>) * @see #setMessageConverter */ @Override protected org.springframework.amqp.core.Message buildMessage(Channel channel, Object result, Type genericType) { MessageConverter converter = getMessageConverter(); if (converter != null && !(result instanceof org.springframework.amqp.core.Message)) { if (result instanceof org.springframework.messaging.Message) { return this.messagingMessageConverter.toMessage(result, new MessageProperties()); } else { return converter.toMessage(result, new MessageProperties(), genericType); } } else { if (!(result instanceof org.springframework.amqp.core.Message)) { throw new MessageConversionException("No MessageConverter specified - cannot handle message [" + result + "]"); } return (org.springframework.amqp.core.Message) result; } }
@Override public void onMessage(org.springframework.amqp.core.Message amqpMessage, Channel channel) throws Exception { // NOSONAR Message<?> message = toMessagingMessage(amqpMessage); if (logger.isDebugEnabled()) { logger.debug("Processing [" + message + "]"); result = invokeHandler(amqpMessage, channel, message); if (result.getReturnValue() != null) { handleResult(result, amqpMessage, channel, message); Object errorResult = this.errorHandler.handleError(amqpMessage, message, e); if (errorResult != null) { handleResult(new InvocationResult(errorResult, null, null), amqpMessage, channel, message); returnOrThrow(amqpMessage, channel, message, ex, ex); returnOrThrow(amqpMessage, channel, message, e.getCause(), e);