package com.miyzh.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; /** * @Description: RabbitConfig * @Author: lyt * @Date: 2019/6/21 11:21 */ @Configuration public class RabbitConfig { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Value("${spring.rabbitmq.host}") private String host; @Value("${spring.rabbitmq.port}") private int port; @Value("${spring.rabbitmq.username}") private String username; @Value("${spring.rabbitmq.password}") private String password; public static final String EXCHANGE_SETTLE = "settexchange"; public static final String QUEUE_SETTLE = "confirmSettle"; public static final String QUEUE_PRESETTLE = "preSettle"; public static final String ROUTINGKEY_CONFIRM = "confirmSettle"; public static final String ROUTINGKEY_PRE = "preSettle"; @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host,port); connectionFactory.setUsername(username); connectionFactory.setPassword(password); connectionFactory.setVirtualHost("/"); connectionFactory.setPublisherConfirms(true); return connectionFactory; } @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //必须是prototype类型 public RabbitTemplate rabbitTemplate() { RabbitTemplate template = new RabbitTemplate(connectionFactory()); return template; } /** * 针对消费者配置 * 1. 设置交换机类型 * 2. 将队列绑定到交换机 FanoutExchange: 将消息分发到所有的绑定队列,无routingkey的概念 HeadersExchange :通过添加属性key-value匹配 DirectExchange:按照routingkey分发到指定队列 TopicExchange:多关键字匹配 */ @Bean public DirectExchange directExchange() { return new DirectExchange(EXCHANGE_SETTLE); } /** * 获取队列Pre * @return */ @Bean public Queue queuePre() { //队列持久 return new Queue(QUEUE_PRESETTLE, true); } @Bean public Binding bindingPre() { return BindingBuilder.bind(queuePre()).to(directExchange()).with(RabbitConfig.ROUTINGKEY_PRE); } /** * 获取队列confirm * @return */ @Bean public Queue queueConfirm() { //队列持久 return new Queue(QUEUE_SETTLE, true); } @Bean public Binding binding() { return BindingBuilder.bind(queueConfirm()).to(directExchange()).with(RabbitConfig.ROUTINGKEY_CONFIRM); } }