@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)); }
@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)); }
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 ifAbsentAllAddedFluencyOnMessageBuilder() { MessageBuilder builder = MessageBuilder.withBody("foo".getBytes()); this.setAllIfAbsent(builder); MessageProperties properties = builder.build().getMessageProperties(); assertUpper(properties); }
@Test public void amqpMessageReturned() { Message message = org.springframework.amqp.core.MessageBuilder.withBody("amqp".getBytes()) .andProperties(MessagePropertiesBuilder.newInstance().setContentType("text/plain").build()).build(); message = this.rabbitTemplate.sendAndReceive("test.amqp.message", message); assertThat(message, is(notNullValue())); assertThat(new String(message.getBody()), equalTo("AMQP")); assertThat(message.getMessageProperties().getHeaders().get("foo"), equalTo("bar")); }
@Test public void messagingMessageReturned() { Message message = org.springframework.amqp.core.MessageBuilder.withBody("\"messaging\"".getBytes()) .andProperties(MessagePropertiesBuilder.newInstance().setContentType("application/json").build()).build(); message = this.rabbitTemplate.sendAndReceive("test.messaging.message", message); assertThat(message, is(notNullValue())); assertThat(new String(message.getBody()), equalTo("{\"field\":\"MESSAGING\"}")); assertThat(message.getMessageProperties().getHeaders().get("foo"), equalTo("bar")); }
@Test public void testWithRepublishRecovererExplicitExchangeAndRouting() throws Throwable { AmqpTemplate amqpTemplate = mock(AmqpTemplate.class); RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new RepublishMessageRecoverer(amqpTemplate, "bar", "baz")) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).build(); delegate.onMessage("", message); assertEquals(3, count.get()); verify(amqpTemplate).send("bar", "baz", message); }
@RabbitListener(queues = "test.amqp.message") public Message amqpMessage(String in) { return org.springframework.amqp.core.MessageBuilder.withBody(in.toUpperCase().getBytes()) .andProperties(MessagePropertiesBuilder.newInstance().setContentType("text/plain") .setHeader("foo", "bar") .build()) .build(); }
@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 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 ifAbsentNoneReplacedFluencyOnMessageBuilder() { MessageBuilder builder = MessageBuilder.withBody("foo".getBytes()); this.setAll(builder); this.setAllIfAbsent(builder); MessageProperties properties = builder.build().getMessageProperties(); assertLower(properties); }
@Test public void replaceAllFluencyOnMessageBuilder() { MessageBuilder builder = MessageBuilder.withBody("foo".getBytes()); this.setAllIfAbsent(builder); this.setAll(builder); MessageProperties properties = builder.build().getMessageProperties(); assertLower(properties); }
@Test public void testRequeueRecoverer() { RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new ImmediateRequeueMessageRecoverer()) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).build(); try { delegate.onMessage("", message); } catch (Exception e) { assertThat(e, instanceOf(ImmediateRequeueAmqpException.class)); } assertEquals(3, count.get()); }
@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 genericMessageTest1() throws Exception { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("\"foo\""); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("withGenericMessageAnyType", Message.class); listener.setMessageConverter(new Jackson2JsonMessageConverter()); message.getMessageProperties().setContentType("application/json"); listener.onMessage(message, channel); assertEquals(String.class, this.sample.payload.getClass()); message = org.springframework.amqp.core.MessageBuilder .withBody("{ \"foo\" : \"bar\" }".getBytes()) .andProperties(message.getMessageProperties()) .build(); listener.onMessage(message, channel); assertEquals(LinkedHashMap.class, this.sample.payload.getClass()); }
@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()); }
@Test public void testNullMPP() throws Exception { class Container extends SimpleMessageListenerContainer { @Override public void executeListener(Channel channel, Message messageIn) { super.executeListener(channel, messageIn); } } Container container = new Container(); container.setMessageListener(m -> { // NOSONAR }); container.setAfterReceivePostProcessors(m -> null); container.setConnectionFactory(mock(ConnectionFactory.class)); container.afterPropertiesSet(); container.start(); try { container.executeListener(null, MessageBuilder.withBody("foo".getBytes()).build()); fail("Expected exception"); } catch (ImmediateAcknowledgeAmqpException e) { // NOSONAR } container.stop(); }
@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()); }