注:文章皆为个人纪录,可用性请以最终结果为准,若有错还请大佬们指出,谢谢!
发送消息与消费消息流程辅助理解
你现在要去约妹,见面前会进行如下对话:
你(消息提供者):我会给你一个惊喜,你找到我我就告诉你,接下来我告诉你我所在的位置:这块地方有很多十字路口,你先找到名叫“交换机”的十字路口,再去找到与”交换机“十字路口相连的名叫"队列"的那条套路,路上有很多人,我拿着一朵叫”RoutingKey“的 fa ,找到我后我就告诉你一个名叫”message“的惊喜
妹子(消费者):SB?
提供者
步骤一:引入依赖(提供者、消费者都要)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
步骤二:创建一个配置类(提供者要)
声明交换机,RoutingKey,队列,并将交换机与队列进行绑定
/** * MQ常量类 */ public class MqConstants {
public static final String EXPORT_QUEUE = "export_queue"; // 文件导出队列名称 public static final String EXPORT_TOPIC_EXCHANGE = "export_topic_exchange"; // 文件导出交换机名称 public static final String EXPORT_ROUTINGKEY = "export.#"; // 文件导出关键字key public static final String durable_yes = "true";//是否持久化
}
@Component
public class MessageSender {
public static final Logger LOGGER = LoggerFactory.getLogger(MessageSender.class);
private static RabbitTemplate rabbitTemplate;
@Autowired
public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
MessageSender.rabbitTemplate = rabbitTemplate;
}
/**
* 导出队列
*
* @return 导出队列
*/
@Bean
@Qualifier(MqConstants.EXPORT_QUEUE)
Queue exportQueue() {
return new Queue(MqConstants.DR_OEM_T1_QUEUE, true, false, false);
}
/**
* 导出交换器
*
* @return 导出交换器
*/
@Bean
@Qualifier(MqConstants.EXPORT_TOPIC_EXCHANGE)
TopicExchange exportTopicExchange() {
return new TopicExchange(MqConstants.DR_OEM_T1_EXCHANGE, true, false);
}
/**
* 导出声明绑定关系
*
* @return 导出声明绑定关系
*/
@Bean
Binding exportBinding(@Qualifier(MqConstants.EXPORT_TOPIC_EXCHANGE) TopicExchange exchange,
@Qualifier(MqConstants.EXPORT_QUEUE) Queue queue) {
return BindingBuilder.bind(queue).to(exchange).with(MqConstants.EXPORT_ROUTINGKEY);
}
/**
* RabbitMQ发送异步导出任务列表信息
*
* @param messageMap 消息
*/
public static void sendMsgAsyncExportExcelByRabbit(Map<String, Object> messageMap) {
try {
rabbitTemplate.convertAndSend(MqConstants.EXPORT_TOPIC_EXCHANGE, MqConstants.EXPORT_ROUTINGKEY, messageMap);
LOGGER.info("发送异步导出任务消息成功, queue = " + MqConstants.EXPORT_QUEUE + ", 消息体为:" + messageMap);
} catch (AmqpException e) {
LOGGER.error("发送异步导出任务消息失败, queue = " + MqConstants.EXPORT_QUEUE + ", 消息体为:" + messageMap);
}
}
}
消息提供者实战示例:
// TODO 业务处理 Map<String, Object> messageMap = new HashMap<>(); messageMap.put("fileName", fileName); messageMap.put("dataTotalCount", count); MessageSender.sendMsgAsyncExportExcelByRabbit(messageMap); // 发送消息-rabbitMQ return "发送消息成功";
在yml或者properties文件中找到rabbitMQ的配置信息中的主机地址 host
再通过访问 host :15672 输入账号密码进入客户端
再点击Exchanges即可查看刚刚创建的交换机信息
再点击Queues即可查看刚刚创建的队列信息,以及消息消费情况
消费者
步骤一:引入依赖(与提供者相同)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
消息消费者实战示例:
@Component @ConfigurationProperties(prefix = "spring.rabbitmq.listener.simple") public class MessageReceiver { /** * 处理导出消息 * * @param messageMap 消息体 */ @RabbitListener( bindings = @QueueBinding( value = @Queue(value = MqConstants.EXPORT_QUEUE, durable = MqConstants.durable_yes), exchange = @Exchange(value = MqConstants.EXPORT_TOPIC_EXCHANGE, durable = MqConstants.durable_yes, type = ExchangeTypes.TOPIC), key = MqConstants.EXPORT_ROUTINGKEY ), containerFactory = "singleContainerFactory" ) @RabbitHandler public void asyncExportMessage(@Payload Map<String, Object> messageMap) { log.info("----asyncExportMessage 收到消息,开始消费-----"); log.debug("===========消息内容==============,{}", messageMap); try { // TODO 业务处理 } catch (Exception e) { log.error("队列 {} 接收数据消费端异常! message = {},exception = {}", MqConstants.EXPORT_QUEUE, JSON.toJSONString(messageMap), e); } log.info("--------asyncExportMessage 消费完成--------"); } }