com.nkapps.billing.configs.RabbitMQConfig.java Source code

Java tutorial

Introduction

Here is the source code for com.nkapps.billing.configs.RabbitMQConfig.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nkapps.billing.configs;

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.config.RetryInterceptorBuilder;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.retry.interceptor.RetryOperationsInterceptor;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_EXCHANGE;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_CLICK_PAYMENT_SUBMIT_ERROR_EVENT;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_CLICK_PAYMENT_SUBMIT_ERROR_QUEUE;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_CLICK_PAYMENT_SUBMIT_EVENT;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_CLICK_PAYMENT_SUBMIT_QUEUE;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_ERROR_EXCHANGE;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_EXCHANGE;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_MUNIS_PAYMENT_SUBMIT_ERROR_EVENT;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_MUNIS_PAYMENT_SUBMIT_ERROR_QUEUE;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_MUNIS_PAYMENT_SUBMIT_EVENT;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_MUNIS_PAYMENT_SUBMIT_QUEUE;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_SMST_PAYMENT_SUBMIT_ERROR_EVENT;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_SMST_PAYMENT_SUBMIT_ERROR_QUEUE;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_SMST_PAYMENT_SUBMIT_EVENT;
import static com.nkapps.billing.services.RabbitMQConstants.BILLING_PG_SMST_PAYMENT_SUBMIT_QUEUE;

/**
 *
 * @author nuraddin
 */
@Configuration
@EnableRabbit
@PropertySource(value = { "classpath:application.properties" })
public class RabbitMQConfig {

    @Autowired
    private Environment environment;

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(environment.getProperty("rabbitmq.host"));
        connectionFactory.setPort(Integer.parseInt(environment.getProperty("rabbitmq.port")));
        connectionFactory.setUsername(environment.getProperty("rabbitmq.username"));
        connectionFactory.setPassword(environment.getProperty("rabbitmq.password"));
        connectionFactory.setVirtualHost(environment.getProperty("rabbitmq.virtual_host"));

        return connectionFactory;
    }

    @Bean
    public AmqpAdmin amqpAdmin() {
        return new RabbitAdmin(connectionFactory());
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());

        template.setExchange(BILLING_EXCHANGE);
        template.setMessageConverter(rabbitMessageConverter());

        return template;
    }

    @Bean
    public MessageConverter rabbitMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public FanoutExchange accountManagerExchange() {
        return new FanoutExchange(BILLING_EXCHANGE, true, false);
    }

    @Bean
    public DirectExchange pgExchange() {
        return new DirectExchange(BILLING_PG_EXCHANGE, true, false);
    }

    public String pgErrorExchangeName() {
        return BILLING_PG_ERROR_EXCHANGE;
    }

    @Bean
    public DirectExchange pgErrorExchange() {
        return new DirectExchange(pgErrorExchangeName(), true, false);
    }

    @Bean
    public Binding exchangeBinding() {
        return BindingBuilder.bind(pgExchange()).to(accountManagerExchange());
    }

    @Bean
    public RetryOperationsInterceptor retryInterceptor() {
        RepublishMessageRecoverer recoverer = new RepublishMessageRecoverer(new RabbitTemplate(connectionFactory()),
                pgErrorExchangeName());
        return RetryInterceptorBuilder.stateless().maxAttempts(3).recoverer(recoverer).build();
    }

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setConcurrentConsumers(3);
        factory.setMaxConcurrentConsumers(10);
        factory.setAdviceChain(retryInterceptor());
        factory.setMessageConverter(rabbitMessageConverter());
        return factory;
    }

    @Bean
    public Queue clickPaymentSubmitQueue() {
        return new Queue(BILLING_PG_CLICK_PAYMENT_SUBMIT_QUEUE, true);
    }

    @Bean
    public Queue clickPaymentSubmitErrorQueue() {
        return new Queue(BILLING_PG_CLICK_PAYMENT_SUBMIT_ERROR_QUEUE, true);
    }

    @Bean
    public Binding clickPaymentSubmitQueueBinding() {
        return BindingBuilder.bind(clickPaymentSubmitQueue()).to(pgExchange())
                .with(BILLING_PG_CLICK_PAYMENT_SUBMIT_EVENT);
    }

    @Bean
    public Binding clickPaymentSubmitErrorQueueBinding() {
        return BindingBuilder.bind(clickPaymentSubmitErrorQueue()).to(pgErrorExchange())
                .with(BILLING_PG_CLICK_PAYMENT_SUBMIT_ERROR_EVENT);
    }

    @Bean
    public Queue smstPaymentSubmitQueue() {
        return new Queue(BILLING_PG_SMST_PAYMENT_SUBMIT_QUEUE, true);
    }

    @Bean
    public Queue smstPaymentSubmitErrorQueue() {
        return new Queue(BILLING_PG_SMST_PAYMENT_SUBMIT_ERROR_QUEUE, true);
    }

    @Bean
    public Binding smstPaymentSubmitQueueBinding() {
        return BindingBuilder.bind(smstPaymentSubmitQueue()).to(pgExchange())
                .with(BILLING_PG_SMST_PAYMENT_SUBMIT_EVENT);
    }

    @Bean
    public Binding smstPaymentSubmitErrorQueueBinding() {
        return BindingBuilder.bind(smstPaymentSubmitErrorQueue()).to(pgErrorExchange())
                .with(BILLING_PG_SMST_PAYMENT_SUBMIT_ERROR_EVENT);
    }

    @Bean
    public Queue munisPaymentSubmitQueue() {
        return new Queue(BILLING_PG_MUNIS_PAYMENT_SUBMIT_QUEUE, true);
    }

    @Bean
    public Queue munisPaymentSubmitErrorQueue() {
        return new Queue(BILLING_PG_MUNIS_PAYMENT_SUBMIT_ERROR_QUEUE, true);
    }

    @Bean
    public Binding munisPaymentSubmitQueueBinding() {
        return BindingBuilder.bind(munisPaymentSubmitQueue()).to(pgExchange())
                .with(BILLING_PG_MUNIS_PAYMENT_SUBMIT_EVENT);
    }

    @Bean
    public Binding munisPaymentSubmitErrorQueueBinding() {
        return BindingBuilder.bind(munisPaymentSubmitErrorQueue()).to(pgErrorExchange())
                .with(BILLING_PG_MUNIS_PAYMENT_SUBMIT_ERROR_EVENT);
    }
}