default UnaryOperator<SimpleMessageListenerContainer> setRetryOpertations(Optional<Integer> maxAttempts, Optional<BackoffOptions> backoffOptions) { StatelessRetryInterceptorBuilder builder = RetryInterceptorBuilder.stateless(); if (maxAttempts.isPresent()) { builder.maxAttempts(maxAttempts.get()); } if (backoffOptions.isPresent()) { BackoffOptions options = backoffOptions.get(); builder.backOffOptions(options.getInitialInterval(), options.getMultiplier(), options.getMaxInterval()); } builder.recoverer(new RejectAndDontRequeueRecoverer()); return setRetryOpertations(builder.build()); } }
@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); }
@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 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")); }
@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 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); }