springspring-bootjavabeansspring-java-config

How can I create bean for adviceChain?


I'm having a hard time converting this spring xml into java config. How can I define an adviceChain bean base on the below spring file.

This's my xml file:

<util:list id="adviceChain">
   <ref bean="retryInterceptor"/>
</util:list>    
<bean id="retryInterceptor" class="org.springframework.amqp.rabbit.config.StatelessRetryOperationsInterceptorFactoryBean">
    <property name="messageRecoverer">
        <bean class="customDiscardingMessageRecoverer" />
    </property>
    <property name="retryOperations" ref="retryTemplate" />
</bean>     
<bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate">
    <property name="backOffPolicy">
        <bean class="org.springframework.retry.backoff.FixedBackOffPolicy">
            <property name="backOffPeriod" value="3000" /> 
        </bean>     
    </property>
    <property name="retryPolicy">
        <bean class="org.springframework.retry.policy.SimpleRetryPolicy">
            <property name="maxAttempts" value="3" />
        </bean>     
    </property>
</bean>

Here is what I tried:

@Bean
StatelessRetryOperationsInterceptorFactoryBean retryInterceptor() {
    StatelessRetryOperationsInterceptorFactoryBean retryInterceptor = new StatelessRetryOperationsInterceptorFactoryBean();
    DiscardingMessageRecoverer messageRecoverer = new DiscardingMessageRecoverer();
    retryInterceptor.setMessageRecoverer(messageRecoverer);
    retryInterceptor.setRetryOperations(retryTemplate());
    return retryInterceptor;
}

@Bean
public RetryTemplate retryTemplate() {
    RetryTemplate retryTemplate = new RetryTemplate();         
    FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
    fixedBackOffPolicy.setBackOffPeriod(3000);
    retryTemplate.setBackOffPolicy(fixedBackOffPolicy); 
    SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
    retryPolicy.setMaxAttempts(3);
    retryTemplate.setRetryPolicy(retryPolicy);         
    return retryTemplate;

@Bean 
SimpleMessageListenerContainer listenerContainer(){
    SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
    listenerContainer.setConnectionFactory(connectionFactory());
    listenerContainer.setConcurrentConsumers(1);
    listenerContainer.setAdviceChain(new Advice[] { (Advice) retryInterceptor() });
    listenerContainer.setMessageListener(listenerAdapter());
    listenerContainer.setQueues(queue());
    return listenerContainer;
}

I receive org.springframework.amqp.rabbit.config.StatelessRetryOperationsInterceptorFactoryBean$$EnhancerBySpringCGLIB$$e3de830c cannot be cast to org.aopalliance.aop.Advice error at the line listenerContainer.setAdviceChain(new Advice[] { (Advice) retryInterceptor() }); I think this's because I didn't define AdviceChain bean like the spring xml file but so far I don't know how.


Solution

  • Edit StatelessRetryOperationsInterceptorFactoryBean like this :

    @Bean
    RetryOperationsInterceptor retryInterceptor() {
        StatelessRetryOperationsInterceptorFactoryBean retryInterceptor = new StatelessRetryOperationsInterceptorFactoryBean();
        DiscardingMessageRecoverer messageRecoverer = new DiscardingMessageRecoverer();
        retryInterceptor.setMessageRecoverer(messageRecoverer);
        retryInterceptor.setRetryOperations(retryTemplate());
        return retryInterceptor.getObject();
    }