/** * A shortcut factory method for creating a message with the given payload * and {@code MessageHeaders}. * <p><strong>Note:</strong> the given {@code MessageHeaders} instance is used * directly in the new message, i.e. it is not copied. * @param payload the payload to use (never {@code null}) * @param messageHeaders the headers to use (never {@code null}) * @return the created message * @since 4.1 */ @SuppressWarnings("unchecked") public static <T> Message<T> createMessage(@Nullable T payload, MessageHeaders messageHeaders) { Assert.notNull(payload, "Payload must not be null"); Assert.notNull(messageHeaders, "MessageHeaders must not be null"); if (payload instanceof Throwable) { return (Message<T>) new ErrorMessage((Throwable) payload, messageHeaders); } else { return new GenericMessage<>(payload, messageHeaders); } }
@SuppressWarnings("unchecked") public Message<T> build() { if (this.originalMessage != null && !this.headerAccessor.isModified()) { return this.originalMessage; } MessageHeaders headersToUse = this.headerAccessor.toMessageHeaders(); if (this.payload instanceof Throwable) { return (Message<T>) new ErrorMessage((Throwable) this.payload, headersToUse); } else { return new GenericMessage<>(this.payload, headersToUse); } }
@Test public void testToString() { ErrorMessage em = new ErrorMessage(new RuntimeException("foo")); String emString = em.toString(); assertThat(emString, not(containsString("original"))); em = new ErrorMessage(new RuntimeException("foo"), new GenericMessage<>("bar")); emString = em.toString(); assertThat(emString, containsString("original")); assertThat(emString, containsString(em.getOriginalMessage().toString())); }
@Test public void resolveMessageSubclassMatch() throws Exception { ErrorMessage message = new ErrorMessage(new UnsupportedOperationException()); MethodParameter parameter = new MethodParameter(this.method, 4); assertTrue(this.resolver.supportsParameter(parameter)); assertSame(message, this.resolver.resolveArgument(parameter, message)); }
@Test public void resolveWithMessageSubclassAndPayloadWildcard() throws Exception { ErrorMessage message = new ErrorMessage(new UnsupportedOperationException()); MethodParameter parameter = new MethodParameter(this.method, 0); assertTrue(this.resolver.supportsParameter(parameter)); assertSame(message, this.resolver.resolveArgument(parameter, message)); }
private Message<?> outputMessage(Message<?> originalMessage, Message<?> retrievedMessage, MessageHeaderAccessor additionalHeaders) { MessageHeaderAccessor headers = MessageHeaderAccessor .getMutableAccessor(originalMessage); if (originalMessage.getPayload() instanceof MessagingException) { headers.copyHeaders(MessageHeaderPropagation.propagationHeaders( additionalHeaders.getMessageHeaders(), this.tracing.propagation().keys())); return new ErrorMessage((MessagingException) originalMessage.getPayload(), isWebSockets(headers) ? headers.getMessageHeaders() : new MessageHeaders(headers.getMessageHeaders())); } headers.copyHeaders(additionalHeaders.getMessageHeaders()); return new GenericMessage<>(retrievedMessage.getPayload(), isWebSockets(headers) ? headers.getMessageHeaders() : new MessageHeaders(headers.getMessageHeaders())); }
return new ErrorMessage((Throwable) message.getPayload(), headers.getMessageHeaders());
@Override public ErrorMessage buildErrorMessage(Throwable throwable, @Nullable AttributeAccessor attributes) { Object inputMessage = attributes == null ? null : attributes.getAttribute(ErrorMessageUtils.INPUT_MESSAGE_CONTEXT_KEY); if (inputMessage instanceof Message) { return new ErrorMessage(throwable, (Message<?>) inputMessage); } else { return new ErrorMessage(throwable); } }
@Override public ErrorMessage buildErrorMessage(Throwable throwable, @Nullable AttributeAccessor context) { Object inputMessage = context == null ? null : context.getAttribute(ErrorMessageUtils.INPUT_MESSAGE_CONTEXT_KEY); Map<String, Object> headers = context == null ? new HashMap<String, Object>() : Collections.singletonMap(AMQP_RAW_MESSAGE, context.getAttribute(AMQP_RAW_MESSAGE)); if (inputMessage instanceof Message) { return new ErrorMessage(throwable, headers, (Message<?>) inputMessage); } else { return new ErrorMessage(throwable, headers); } }
@Override protected ErrorMessage buildMessage(MutableMessageHeaders headers, Object payload, JsonNode root, DeserializationContext ctxt) throws IOException { Message<?> originalMessage = getMapper().readValue(root.get("originalMessage").traverse(), Message.class); return new ErrorMessage((Throwable) payload, headers, originalMessage); }
protected final void sendExceptionToListener(Exception e) { TcpListener listenerForException = getListener(); if (!this.exceptionSent.getAndSet(true) && listenerForException != null) { Map<String, Object> headers = Collections.singletonMap(IpHeaders.CONNECTION_ID, (Object) this.getConnectionId()); ErrorMessage errorMessage = new ErrorMessage(e, headers); listenerForException.onMessage(errorMessage); } }
@Override @SuppressWarnings("unchecked") public Message<T> build() { if (!this.modified && !this.headerAccessor.isModified() && this.originalMessage != null && !containsReadOnly(this.originalMessage.getHeaders())) { return this.originalMessage; } if (this.payload instanceof Throwable) { return (Message<T>) new ErrorMessage((Throwable) this.payload, this.headerAccessor.toMap()); } return new GenericMessage<T>(this.payload, this.headerAccessor.toMap()); }
@Test(expected = MessageDeliveryException.class) public void superclassOfAcceptedTypeNotAccepted() { MessageChannel channel = createChannel(RuntimeException.class); channel.send(new ErrorMessage(new Exception("test"))); }
@Test public void validateExceptionTypeRouterConfig() { inputChannel.send(new ErrorMessage(new NullPointerException())); assertThat(npeChannel.receive(1000).getPayload(), instanceOf(NullPointerException.class)); inputChannel.send(new ErrorMessage(new IllegalArgumentException())); assertThat(illegalChannel.receive(1000).getPayload(), instanceOf(IllegalArgumentException.class)); inputChannel.send(new ErrorMessage(new RuntimeException())); assertThat(defaultChannel.receive(1000).getPayload(), instanceOf(RuntimeException.class)); }
@Override public ErrorMessage convert(Document source) { @SuppressWarnings("unchecked") Map<String, Object> headers = MongoDbMessageStore.this.converter.normalizeHeaders((Map<String, Object>) source.get("headers")); Object payload = this.deserializingConverter.convert(((Binary) source.get("payload")).getData()); ErrorMessage message = new ErrorMessage((Throwable) payload, headers); // NOSONAR not null enhanceHeaders(message.getHeaders(), headers); return message; }
@Test public void testSuperclassOfAcceptedTypeIsNotSelected() { PayloadTypeSelector selector = new PayloadTypeSelector(RuntimeException.class); assertFalse(selector.accept(new ErrorMessage(new Exception("test")))); }
@Test public void subclassOfAcceptedType() { MessageChannel channel = createChannel(RuntimeException.class); assertTrue(channel.send(new ErrorMessage(new MessagingException("test")))); }
@Test public void testExceptionTypeRouteFlow() { Message<?> failedMessage = new GenericMessage<>("foo"); IllegalArgumentException rootCause = new IllegalArgumentException("bad argument"); RuntimeException middleCause = new RuntimeException(rootCause); MessageHandlingException error = new MessageHandlingException(failedMessage, "failed", middleCause); ErrorMessage message = new ErrorMessage(error); this.exceptionTypeRouteFlowInput.send(message); assertNotNull(this.illegalArgumentChannel.receive(1000)); assertNull(this.exceptionRouterDefaultChannel.receive(0)); assertNull(this.runtimeExceptionChannel.receive(0)); assertNull(this.messageHandlingExceptionChannel.receive(0)); }
@Test public void testMultipleAcceptedTypes() { PayloadTypeSelector selector = new PayloadTypeSelector(String.class, Integer.class); assertTrue(selector.accept(new GenericMessage<>("test1"))); assertTrue(selector.accept(new GenericMessage<>(2))); assertFalse(selector.accept(new ErrorMessage(new RuntimeException()))); }
@Test public void testSubclassOfAcceptedTypeIsSelected() { PayloadTypeSelector selector = new PayloadTypeSelector(RuntimeException.class); assertTrue(selector.accept(new ErrorMessage(new MessagingException("test")))); }