# rabbitmq消息队列集成2.4+ >[info] 采用rabbitmq实现消息队列,应用场景:功能解耦、流量削峰、异步处理 > 示例代码:`jeecg-cloud-module\jeecg-cloud-test\jeecg-cloud-test-rabbitmq` [TOC] ## 前提:搭建好rabbitmq服务 [# docker安装RabbitMq](https://my.oschina.net/jeecg/blog/4729143) 访问下RabbitM后台 http://localhost:15672 ![](https://img.kancloud.cn/7d/7d/7d7dac74c3b33b5ac98995b2b476ad99_1600x868.png) >[warning] 重要:JeecgBoot启动会自动创建两个交换机 `jeecg.delayed.exchange` `jeecg.direct.exchange` ,如果没有生成,请手工创建。 ![](https://img.kancloud.cn/4b/65/4b65e69679b4bfb5fdf15cf47db05ff9_651x67.png) ## 第一步:引入消息队列starter依赖 ~~~ <!--引入rabbitmq Starter--> <dependency> <groupId>org.jeecgframework.boot</groupId> <artifactId>jeecg-boot-starter-rabbitmq</artifactId> </dependency> ~~~ ## 第二步:RabbitMqClient用法(推送消息) 为了简化MQ使用做了封装,提供推送消息的简易工具类 ``` @Autowired private RabbitMqClient rabbitMqClient; ``` **常用方法** - 立即发送 void sendMessage(String queueName, Object params) - 发送延时消息 void sendMessage(String queueName, Object params, Integer expiration) - 发送远程消息 void publishEvent(String handlerName, BaseMap params) **方法参数统一说明** | 参数名 | 参数描述 | 参数类型 | --- | --- |--- | | queueName | 队列名称(队列自动创建,无需手动)| String | handlerName| 参数|自定义消息处理器beanName | params| 参数|Object | expiration| 延迟时间| int(毫秒) >[warning] queueName不需要去MQ中创建,jeecg做了封装会自动创建。 ## 第三步: 编写示例(简单3步完成消息的发送和接收) 1. **注入消息发送客户端** ``` @Autowired private RabbitMqClient rabbitMqClient; ``` 2. **发送消息示例代码** ``` BaseMap map = new BaseMap(); map.put("orderId", "12345"); rabbitMqClient.sendMessage("test", map); //延迟10秒发送 rabbitMqClient.sendMessage("test", map,10000); ``` 3. **编写消息监听监听器** 使用注解`@RabbitListener(queues = "test2")`定义接收者(可以定义N个接受者,消息会均匀的发送到N个接收者中) ~~~ import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; import org.jeecg.boot.starter.rabbitmq.core.BaseRabbiMqHandler; import org.jeecg.boot.starter.rabbitmq.listenter.MqListener; import org.jeecg.common.annotation.RabbitComponent; import org.jeecg.common.base.BaseMap; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.support.AmqpHeaders; import org.springframework.messaging.handler.annotation.Header; @Slf4j @RabbitListener(queues = "test3") @RabbitComponent(value = "testListener3") public class DemoRabbitMqListener3 extends BaseRabbiMqHandler<BaseMap> { @RabbitHandler public void onMessage(BaseMap baseMap, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) { super.onMessage(baseMap, deliveryTag, channel, new MqListener<BaseMap>() { @Override public void handler(BaseMap map, Channel channel) { String orderId = map.get("orderId").toString(); log.info("业务处理3:orderId:" + orderId); } }); } } ~~~ 或者 ~~~ import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; import org.jeecg.boot.starter.rabbitmq.core.BaseRabbiMqHandler; import org.jeecg.boot.starter.rabbitmq.listenter.MqListener; import org.jeecg.common.annotation.RabbitComponent; import org.jeecg.common.base.BaseMap; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.support.AmqpHeaders; import org.springframework.messaging.handler.annotation.Header; @Slf4j @RabbitComponent(value = "testListener2") public class DemoRabbitMqListener2 extends BaseRabbiMqHandler<BaseMap> { @RabbitListener(queues = "test2") public void onMessage(BaseMap baseMap, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) { super.onMessage(baseMap, deliveryTag, channel, new MqListener<BaseMap>() { @Override public void handler(BaseMap map, Channel channel) { String orderId = map.get("orderId"); log.info("业务处理2:orderId:" + orderId); } }); } } ~~~ N个接受者效果图 ![](https://img.kancloud.cn/d0/bb/d0bbd0422f37eccf2786c2827516d3e0_1307x1242.png)