版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CoderTnT/article/details/85994619
1,application.properties对rabbitmq的配置
#对于rabbitMQ的支持 ######################################################## spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
2,配置RabbitConfig
package com.lc.config; import com.lc.Component.ComponentProperties; 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.Autowired; 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; /** * @author liuchaoOvO on 2018/12/28 */ @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_A = "my-mq-exchange_A"; public static final String EXCHANGE_B = "my-mq-exchange_B"; public static final String EXCHANGE_C = "my-mq-exchange_C"; public static final String QUEUE_A = "QUEUE_A"; public static final String QUEUE_B = "QUEUE_B"; public static final String QUEUE_C = "QUEUE_C"; public static final String ROUTINGKEY_A = "spring-boot-routingKey_A"; public static final String ROUTINGKEY_B = "spring-boot-routingKey_B"; public static final String ROUTINGKEY_C = "spring-boot-routingKey_C"; public final static String TopicMsg= "topic.message"; public final static String TopicMsgs = "topic.messages"; @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 defaultExchange() { return new DirectExchange(EXCHANGE_A); } @Bean TopicExchange exchange() { return new TopicExchange("exchange"); } @Bean FanoutExchange fanoutExchange() { return new FanoutExchange("fanoutExchange"); } /** * 获取队列A */ @Bean public Queue queueA() { return new Queue(QUEUE_A, true); //队列持久 } /** * 获取队列B */ @Bean public Queue queueB() { return new Queue(QUEUE_B, true); //队列持久 } /** * 获取Topic队列C */ @Bean public Queue queueC() { return new Queue(TopicMsg, true); //队列持久 } @Bean public Queue queueFanoutA() { return new Queue("fanout.A"); } @Bean public Queue queueFanoutB() { return new Queue("fanout.B"); } @Bean public Binding bindingA() { return BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTINGKEY_A); } @Bean public Binding bindingB(){ return BindingBuilder.bind(queueB()).to(defaultExchange()).with(RabbitConfig.ROUTINGKEY_B); } @Bean Binding bindingTopicMsg(Queue queueC, TopicExchange exchange) { return BindingBuilder.bind(queueC).to(exchange).with(TopicMsg); } @Bean Binding bindingTopicMsgs(Queue queueC, TopicExchange exchange) { return BindingBuilder.bind(queueC).to(exchange).with("topic.#"); } @Bean Binding bindingFanoutExchangeA(Queue queueFanoutA,FanoutExchange fanoutExchange) { return BindingBuilder.bind(queueFanoutA).to(fanoutExchange); } @Bean Binding bindingFanoutExchangeB(Queue queueFanoutB,FanoutExchange fanoutExchange) { return BindingBuilder.bind(queueFanoutB).to(fanoutExchange); } }
3,Producer生产者
package com.lc.Producer; import com.lc.config.RabbitConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.support.CorrelationData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; /** * @author liuchaoOvO on 2018/12/28 */ @Component public class MsgProducer implements RabbitTemplate.ConfirmCallback { private final Logger logger = LoggerFactory.getLogger(this.getClass()); //由于rabbitTemplate的scope属性设置为ConfigurableBeanFactory.SCOPE_PROTOTYPE,所以不能自动注入 private RabbitTemplate rabbitTemplate; /** * 构造方法注入rabbitTemplate */ @Autowired public MsgProducer(RabbitTemplate rabbitTemplate) { this.rabbitTemplate = rabbitTemplate; rabbitTemplate.setConfirmCallback(this); //rabbitTemplate如果为单例的话,那回调就是最后设置的内容 } public void sendMsg(String content) { CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString()); //把消息放入ROUTINGKEY_A对应的队列当中去,对应的是队列A rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_A, RabbitConfig.ROUTINGKEY_A, content, correlationId); } public void sendTopicMsg(String content) { CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend("exchange", RabbitConfig.TopicMsg, content, correlationId); } public void sendTopicMsgs(String content) { CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend("exchange", RabbitConfig.TopicMsgs, content, correlationId); } public void sendFanoutMsgs(String content) { CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString()); System.out.println("Sender : " + content); rabbitTemplate.convertAndSend("fanoutExchange", "", content, correlationId); } /** * 回调 */ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { logger.info(" 回调id:" + correlationData); if (ack) { logger.info("消息成功消费"); } else { logger.info("消息消费失败:" + cause); } } }
4,Receiver消费者
package com.lc.Receiver; import com.lc.config.RabbitConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * @author liuchaoOvO on 2018/12/28 */ @Component @RabbitListener(queues = RabbitConfig.QUEUE_A) public class MsgReceiver { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @RabbitHandler public void process(String content) { logger.info("接收处理队列A当中的消息: " + content); } } 或者
package com.lc.Receiver; import com.lc.config.RabbitConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * @author liuchaoOvO on 2018/12/28 */ @Component @RabbitListener(queues = RabbitConfig.TopicMsg) public class MsgReceiverTopicOne { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @RabbitHandler public void process(String content) { logger.info("接收处理MsgReceiverTopicOne当中的消息: " + content); } } 或者
package com.lc.Receiver; import com.lc.config.RabbitConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * @author liuchaoOvO on 2018/12/28 */ @Component @RabbitListener(queues = RabbitConfig.TopicMsg) public class MsgReceiverTopicTwo { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @RabbitHandler public void process(String content) { logger.info("接收处理MsgReceiverTopicTwo当中的消息: " + content); } } 5,调用方式
在某个类文件对象中,注入生产者消息对象: @Autowired private MsgProducer msgProducer; 执行相应的生产者函数逻辑代码: 例如:msgProducer.sendFanoutMsgs("sendFanoutMsgs===");
则在相应的,通过queue类型
@RabbitListener(queues = RabbitConfig.QUEUE_A)
例如对队列A的匹配下的消费者的
@RabbitHandler public void process(String content) { logger.info("接收处理队列A当中的消息: " + content); }
执行方法中处理相应的业务逻辑。