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 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()); }
@Bean SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setQueueNames(queueName); container.setMessageListener(listenerAdapter); container.setAdviceChain(new Advice[]{ org.springframework.amqp.rabbit.config.RetryInterceptorBuilder .stateless() .maxAttempts(maxAttempts) .backOffOptions(initialInterval, multiplier, maxInterval) .build() }); return container; }
@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 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); }
@Bean public RetryOperationsInterceptor rabbitSourceRetryInterceptor() { return RetryInterceptorBuilder.stateless() .maxAttempts(this.properties.getMaxAttempts()) .backOffOptions(this.properties.getInitialRetryInterval(), this.properties.getRetryMultiplier(), this.properties.getMaxRetryInterval()) .recoverer(new RejectAndDontRequeueRecoverer()) .build(); }
/** * Create a builder for a stateless retry interceptor. * @return The interceptor builder. */ public static StatelessRetryInterceptorBuilder stateless() { return new StatelessRetryInterceptorBuilder(); }
@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); }
@Override public RetryOperationsInterceptor build() { this.applyCommonSettings(this.factoryBean); return this.factoryBean.getObject(); }
/** * Create a builder for a stateless retry interceptor. * @return The interceptor builder. */ public static StatelessRetryInterceptorBuilder stateless() { return new StatelessRetryInterceptorBuilder(); }
@Override public RetryOperationsInterceptor build() { this.applyCommonSettings(this.factoryBean); return this.factoryBean.getObject(); }
@Bean public RetryOperationsInterceptor rabbitSourceRetryInterceptor() { return RetryInterceptorBuilder.stateless() .maxAttempts(this.properties.getMaxAttempts()) .backOffOptions(this.properties.getInitialRetryInterval(), this.properties.getRetryMultiplier(), this.properties.getMaxRetryInterval()) .recoverer(new RejectAndDontRequeueRecoverer()) .build(); }