@Test public void testRetryWithinOnMessageAdapter() throws Exception { ConnectionFactory connectionFactory = mock(ConnectionFactory.class); AbstractMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory); AmqpInboundChannelAdapter adapter = new AmqpInboundChannelAdapter(container); adapter.setOutputChannel(new DirectChannel()); adapter.setRetryTemplate(new RetryTemplate()); QueueChannel errors = new QueueChannel(); ErrorMessageSendingRecoverer recoveryCallback = new ErrorMessageSendingRecoverer(errors); recoveryCallback.setErrorMessageStrategy(new AmqpMessageHeaderErrorMessageStrategy()); adapter.setRecoveryCallback(recoveryCallback); adapter.afterPropertiesSet(); ChannelAwareMessageListener listener = (ChannelAwareMessageListener) container.getMessageListener(); listener.onMessage(org.springframework.amqp.core.MessageBuilder.withBody("foo".getBytes()) .andProperties(new MessageProperties()).build(), null); Message<?> errorMessage = errors.receive(0); assertNotNull(errorMessage); assertThat(errorMessage.getPayload(), instanceOf(MessagingException.class)); MessagingException payload = (MessagingException) errorMessage.getPayload(); assertThat(payload.getMessage(), containsString("Dispatcher has no")); assertThat(StaticMessageHeaderAccessor.getDeliveryAttempt(payload.getFailedMessage()).get(), equalTo(3)); org.springframework.amqp.core.Message amqpMessage = errorMessage.getHeaders() .get(AmqpMessageHeaderErrorMessageStrategy.AMQP_RAW_MESSAGE, org.springframework.amqp.core.Message.class); assertThat(amqpMessage, notNullValue()); assertNull(errors.receive(0)); }
private MessageBuilder(byte[] body, MessageProperties properties) { //NOSONAR this.body = body; this.copyProperties(properties); }
/** * The final message body will be a direct reference to the message * body, the MessageProperties will be a shallow copy. * @param message The message. * @return The builder. */ public static MessageBuilder fromMessage(Message message) { Assert.notNull(message, MESSAGE_CANNOT_BE_NULL); return new MessageBuilder(message); }
@Test public void fromBodyAndMessage() { byte[] bytes = "foo".getBytes(); MessageProperties properties = this.setAll(MessagePropertiesBuilder.newInstance()) .setReplyTo("replyTo") .setReplyToIfAbsent("foo") .build(); Message message1 = MessageBuilder.withBody(bytes) .andProperties(properties) .build(); assertSame(bytes, message1.getBody()); assertEquals("replyTo", message1.getMessageProperties().getReplyTo()); Message message2 = MessageBuilder.fromMessage(message1) .setReplyTo("foo") .build(); assertSame(bytes, message2.getBody()); assertNotSame(message1.getMessageProperties(), message2.getMessageProperties()); assertEquals(message1.getMessageProperties(), MessageBuilder.fromMessage(message2).setReplyTo("replyTo").build().getMessageProperties()); assertEquals("foo", message2.getMessageProperties().getReplyTo()); Message message3 = MessageBuilder.fromClonedMessage(message1) .setReplyToIfAbsent("foo") .build(); assertEquals("replyTo", message3.getMessageProperties().getReplyTo()); Message message4 = MessageBuilder.fromClonedMessage(message1) .setReplyTo(null) .setReplyToIfAbsent("foo") .build(); assertEquals("foo", message4.getMessageProperties().getReplyTo()); }
@Test public void copyProperties() { byte[] bytes = "foo".getBytes(); Message message1 = MessageBuilder.withBody(bytes) .andProperties(this.setAll(MessagePropertiesBuilder.newInstance()) .setReplyTo("replyTo") .build()) .build(); assertSame(bytes, message1.getBody()); Message message2 = MessageBuilder.withBody("bar".getBytes()) .copyProperties(message1.getMessageProperties()) .build(); assertNotSame(message1.getMessageProperties(), message2.getMessageProperties()); assertEquals(message1.getMessageProperties(), message2.getMessageProperties()); Message message3 = MessageBuilder.withBody("bar".getBytes()) .copyProperties(message1.getMessageProperties()) .removeHeader("foo") .build(); assertEquals(2, message3.getMessageProperties().getHeaders().size()); Message message4 = MessageBuilder.withBody("bar".getBytes()) .copyProperties(message1.getMessageProperties()) .removeHeaders() .build(); assertEquals(0, message4.getMessageProperties().getHeaders().size()); }
@Test public void fromBodyAndMessageRange() { byte[] bytes = "foobar".getBytes(); Message message1 = MessageBuilder.withBody(bytes, 2, 5) .andProperties(this.setAll(MessagePropertiesBuilder.newInstance()) .build()) .build(); assertTrue(Arrays.equals("oba".getBytes(), message1.getBody())); Message message2 = MessageBuilder.fromClonedMessage(message1).build(); assertNotSame(message1.getBody(), message2.getBody()); assertTrue(Arrays.equals(message1.getBody(), message2.getBody())); assertEquals(message1.getMessageProperties(), message2.getMessageProperties()); }
MessageProperties properties = new MessageProperties(); Address replyTo = new Address("address"); Message message1 = MessageBuilder.withClonedBody(bytes) .andProperties(this.setAll(MessagePropertiesBuilder.fromClonedProperties(properties)) .setReplyToAddress(replyTo) .setReplyToAddressIfAbsent(new Address("addressxxxx")) .build()) .build(); assertNotSame(bytes, message1.getBody()); assertTrue(Arrays.equals(bytes, message1.getBody())); Message message2 = MessageBuilder.fromClonedMessage(message1) .setReplyToAddress(foo) .build(); assertNotSame(message1.getBody(), message2.getBody()); assertTrue(Arrays.equals(bytes, message2.getBody())); assertEquals(message1.getMessageProperties(), MessageBuilder.fromMessage(message2) .setReplyToAddress(replyTo).build().getMessageProperties()); assertEquals(foo.toString(), message2.getMessageProperties().getReplyToAddress().toString()); Message message3 = MessageBuilder.fromClonedMessage(message1) .setReplyToAddressIfAbsent(foo) .build(); assertEquals(replyTo.toString(), message3.getMessageProperties().getReplyToAddress().toString()); Message message4 = MessageBuilder.fromClonedMessage(message1) .setReplyToAddress(null) .setReplyToAddressIfAbsent(foo) .build();
protected void sendPingReponseToDmfReceiver(final Message ping, final String tenant, final String virtualHost) { final Message message = MessageBuilder.withBody(String.valueOf(System.currentTimeMillis()).getBytes()) .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN) .setCorrelationId(ping.getMessageProperties().getCorrelationId()) .setHeader(MessageHeaderKey.TYPE, MessageType.PING_RESPONSE).setHeader(MessageHeaderKey.TENANT, tenant) .build(); amqpSenderService.sendMessage(message, IpUtil.createAmqpUri(virtualHost, ping.getMessageProperties().getReplyTo())); }
@Test public void testWithRepublishRecovererDefaultExchangeAndRoutingCustomPrefix() throws Throwable { AmqpTemplate amqpTemplate = mock(AmqpTemplate.class); RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new RepublishMessageRecoverer(amqpTemplate).errorRoutingKeyPrefix("bar.")) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).setReceivedRoutingKey("foo").build(); delegate.onMessage("", message); assertEquals(3, count.get()); verify(amqpTemplate).send("bar.foo", message); }
@Test public void testWithCustomKeyGenerator() throws Exception { final CountDownLatch latch = new CountDownLatch(1); StatefulRetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateful() .messageKeyGenerator(message -> { latch.countDown(); return "foo"; }) .build(); assertEquals(3, TestUtils.getPropertyValue(interceptor, "retryOperations.retryPolicy.maxAttempts")); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).setRedelivered(false).build(); try { delegate.onMessage("", message); } catch (RuntimeException e) { assertEquals("foo", e.getMessage()); } assertEquals(1, count.get()); assertTrue(latch.await(0, TimeUnit.SECONDS)); }
@Test public void testWithCustomNewMessageIdentifier() throws Exception { final CountDownLatch latch = new CountDownLatch(1); StatefulRetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateful() .maxAttempts(5) .newMessageIdentifier(message -> { latch.countDown(); return false; }) .backOffPolicy(new FixedBackOffPolicy()) .build(); assertEquals(5, TestUtils.getPropertyValue(interceptor, "retryOperations.retryPolicy.maxAttempts")); assertEquals(1000L, TestUtils.getPropertyValue(interceptor, "retryOperations.backOffPolicy.backOffPeriod")); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).setMessageId("foo").setRedelivered(false).build(); try { delegate.onMessage("", message); } catch (RuntimeException e) { assertEquals("foo", e.getMessage()); } assertEquals(1, count.get()); assertTrue(latch.await(0, TimeUnit.SECONDS)); }
@Test public void testWithRepublishRecovererDefaultExchangeAndRouting() throws Throwable { AmqpTemplate amqpTemplate = mock(AmqpTemplate.class); RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new RepublishMessageRecoverer(amqpTemplate) { @Override protected Map<? extends String, ? extends Object> additionalHeaders(Message message, Throwable cause) { return Collections.singletonMap("fooHeader", "barValue"); } }) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder .withBody("".getBytes()) .setReceivedExchange("exch") .setReceivedRoutingKey("foo") .build(); delegate.onMessage("", message); assertEquals(3, count.get()); verify(amqpTemplate).send("error.foo", message); assertNotNull(message.getMessageProperties().getHeaders() .get(RepublishMessageRecoverer.X_EXCEPTION_STACKTRACE)); assertNotNull(message.getMessageProperties().getHeaders().get(RepublishMessageRecoverer.X_EXCEPTION_MESSAGE)); assertNotNull(message.getMessageProperties().getHeaders().get(RepublishMessageRecoverer.X_ORIGINAL_EXCHANGE)); assertNotNull(message.getMessageProperties().getHeaders() .get(RepublishMessageRecoverer.X_ORIGINAL_ROUTING_KEY)); assertEquals("barValue", message.getMessageProperties().getHeaders().get("fooHeader")); }
/** * Sends a message to a service that upcases the String and returns as a reply * using a {@link RabbitTemplate} configured with a fixed reply queue and * reply listener, configured with JavaConfig. */ @Test public void testReplyContainer() { assertEquals("FOO", this.fixedReplyQRabbitTemplate.convertSendAndReceive("foo")); Message message = MessageBuilder.withBody("foo".getBytes()) .setContentType("text/plain") .build(); Message reply = this.fixedReplyQRabbitTemplate.sendAndReceive(message); assertEquals(this.replyExchange.getName(), reply.getMessageProperties().getReceivedExchange()); }
@Test public void testWithRepublishRecovererCustomExchangeAndDefaultRoutingCustomPrefix() throws Throwable { AmqpTemplate amqpTemplate = mock(AmqpTemplate.class); RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new RepublishMessageRecoverer(amqpTemplate, "baz").errorRoutingKeyPrefix("bar.")) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).setReceivedRoutingKey("foo").build(); delegate.onMessage("", message); assertEquals(3, count.get()); verify(amqpTemplate).send("baz", "bar.foo", message); }
@Test public void testRetryWithinOnMessageGateway() throws Exception { ConnectionFactory connectionFactory = mock(ConnectionFactory.class); AbstractMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory); AmqpInboundGateway adapter = new AmqpInboundGateway(container); adapter.setRequestChannel(new DirectChannel()); adapter.setRetryTemplate(new RetryTemplate()); QueueChannel errors = new QueueChannel(); ErrorMessageSendingRecoverer recoveryCallback = new ErrorMessageSendingRecoverer(errors); recoveryCallback.setErrorMessageStrategy(new AmqpMessageHeaderErrorMessageStrategy()); adapter.setRecoveryCallback(recoveryCallback); adapter.afterPropertiesSet(); ChannelAwareMessageListener listener = (ChannelAwareMessageListener) container.getMessageListener(); listener.onMessage(org.springframework.amqp.core.MessageBuilder.withBody("foo".getBytes()) .andProperties(new MessageProperties()).build(), null); Message<?> errorMessage = errors.receive(0); assertNotNull(errorMessage); assertThat(errorMessage.getPayload(), instanceOf(MessagingException.class)); MessagingException payload = (MessagingException) errorMessage.getPayload(); assertThat(payload.getMessage(), containsString("Dispatcher has no")); assertThat(StaticMessageHeaderAccessor.getDeliveryAttempt(payload.getFailedMessage()).get(), equalTo(3)); org.springframework.amqp.core.Message amqpMessage = errorMessage.getHeaders() .get(AmqpMessageHeaderErrorMessageStrategy.AMQP_RAW_MESSAGE, org.springframework.amqp.core.Message.class); assertThat(amqpMessage, notNullValue()); assertNull(errors.receive(0)); }
container.start(); Message message = MessageBuilder.withBody("foo".getBytes()) .setContentType("text/plain") .setContentEncoding("junk") .build();
/** * The final message body will be a direct reference to 'body'. * @param body The body. * @return The builder. */ public static MessageBuilder withBody(byte[] body) { Assert.notNull(body, BODY_CANNOT_BE_NULL); return new MessageBuilder(body); }