Java tutorial
/* * 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); } }