生產者:
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); }