生产者:
package com.coship.ac.rabbitMq; import com.coship.common.rabbitMq.AlarmMessage; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.Properties; /** * @Description: 发送告警日志 * @Author: 910155 * @Date: 2019/5/9 14:24 */ @Component public class RabbitMqAlarmProvider { @Autowired private AmqpAdmin admin; @Autowired private AmqpTemplate template; private static AmqpAdmin amqpAdmin; private static AmqpTemplate amqpTemplate; private static RabbitMqAlarmProvider rabbitMqAlarmProvider; @PostConstruct public void init(){ rabbitMqAlarmProvider = this; amqpAdmin = this.admin; amqpTemplate = this.template; createQueueAndBinding("exchange.ac.alarm.message", "alarmMessageAc", "routing.ac.alarm.message"); } /** * 创建一个持久化的、非排他的、非自动删除的队列 * @param name * @return */ public static String createQueue(String name) { // 创建一个持久化的、非排他的、非自动删除的队列 Queue queue = new Queue(name,true,false,false,null); return createQueue(queue); } /** * 创建队列 * @param queue * @return */ public static String createQueue(Queue queue) { return amqpAdmin.declareQueue(queue); } /** * 将队列与交换器绑定 * @param exchangeName 交换器名称 * @param queueName 队列名称 * @param routingKey 路由键 */ public static void binding(String exchangeName,String queueName,String routingKey) { Binding binding = new Binding(queueName, Binding.DestinationType.QUEUE,exchangeName,routingKey,null); binding(binding); } /** * 将队列与交换器绑定 * @param binding */ public static void binding(Binding binding) { amqpAdmin.declareBinding(binding); } /** * * @param exchangeName 交换器名称 * @param queueName 队列名称 * @param routingKey 路由键 */ public static void createQueueAndBinding(String exchangeName,String queueName,String routingKey) { RabbitMqAlarmProvider.createDirectExchange(exchangeName); // 创建一个持久化的、非排他的、非自动删除的队列 Queue queue = new Queue(queueName,true,false,false,null); createQueue(queue); Binding binding = new Binding(queueName, Binding.DestinationType.QUEUE,exchangeName,routingKey,null); binding(binding); } /** * 检查队列是否存在 * @param queueName 队列名称 * @return 如果队列存在则放回true */ public static boolean checkQueueExists(String queueName) { Properties queueProperties = amqpAdmin.getQueueProperties(queueName); if(null == queueProperties) { return false; } return true; } /** * 创建direct类型的交换器 * @param exchangeName */ public static void createDirectExchange(String exchangeName) { Exchange exchange = new DirectExchange(exchangeName); amqpAdmin.declareExchange(exchange); } /** * 创建交换器 * @param exchange */ public static void createExchange(Exchange exchange) { amqpAdmin.declareExchange(exchange); } /** * @Description: 发送告警日志 * @Author: 910155 * @Date: 2019/5/9 14:45 */ public static void sendAlarmMessage(String exchangeName, String routingkey, AlarmMessage alarmMessage){ amqpTemplate.convertAndSend(exchangeName,routingkey,alarmMessage); } }
消费者:
package com.coship.ac.rabbitMq; import com.coship.ac.service.AlarmService; import com.coship.common.rabbitMq.AlarmMessage; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.springframework.amqp.core.ExchangeTypes; import org.springframework.amqp.rabbit.annotation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * @Description: 消费MQ中告警数据,并存入mongodb * @Author: 910155 * @Date: 2019/5/9 14:48 */ @Component @RabbitListener(bindings = @QueueBinding( value = @Queue(value = "alarmMessageAc", autoDelete = "false"), exchange = @Exchange(value = "exchange.ac.alarm.message", type = ExchangeTypes.DIRECT), key = "routing.ac.alarm.message" )) public class RabbitMqAlarmConsume { private Log log = LogFactory.getLog(RabbitMqAlarmConsume.class); @Autowired private AlarmService alarmService; @RabbitHandler public void receive(AlarmMessage alarmMessage) { log.info("从【MQ接收消息成功】,消息内容是:" + alarmMessage); try { alarmService.insertAlarmInfo(alarmMessage); log.info("【日志数据】:"+alarmMessage+"存入mongodb成功!"); } catch (Exception e) { log.error("RabbitMqAlarmConsume", e); } } }
pom文件导入依赖:
<!-- 与消息队列的整合 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <!--<version>4.5.6</version>--> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency>
Apollo配置:
spring.rabbitmq.host =
spring.rabbitmq.port = 5672
spring.rabbitmq.username =
spring.rabbitmq.password =
spring.rabbitmq.virtual-host = coship
测试类:
/** * @Description: 测试告警消息生产者 * @Author: 910155 * @Date: 2019/5/9 16:19 */ @PostMapping("v1/sendMQ/message") public void testMQ(@RequestBody AlarmMessage alarmMessage){ //RabbitMQUtil.sendMessage("exchange.ac.alarm.log","routing.key.ac.alarm.log",alarmMessage); RabbitMqAlarmProvider.sendAlarmMessage("exchange.ac.alarm.message","routing.ac.alarm.message",alarmMessage); }