package cn.iocoder.yudao.module.iot.service.rule.data.action; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; import cn.iocoder.yudao.module.iot.dal.dataobject.rule.config.IotDataSinkRabbitMQConfig; import cn.iocoder.yudao.module.iot.enums.rule.IotDataSinkTypeEnum; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.stereotype.Component; /** * RabbitMQ 的 {@link IotDataRuleAction} 实现类 * * @author HUIHUI */ @ConditionalOnClass(name = "com.rabbitmq.client.Channel") @Component @Slf4j public class IotRabbitMQDataRuleAction extends IotDataRuleCacheableAction { @Override public Integer getType() { return IotDataSinkTypeEnum.RABBITMQ.getType(); } @Override public void execute(IotDeviceMessage message, IotDataSinkRabbitMQConfig config) throws Exception { try { // 1.1 获取或创建 Channel Channel channel = getProducer(config); // 1.2 声明交换机、队列和绑定关系 channel.exchangeDeclare(config.getExchange(), "direct", true); channel.queueDeclare(config.getQueue(), true, false, false, null); channel.queueBind(config.getQueue(), config.getExchange(), config.getRoutingKey()); // 2. 发送消息 channel.basicPublish(config.getExchange(), config.getRoutingKey(), null, JsonUtils.toJsonByte(message)); log.info("[execute][message({}) config({}) 发送成功]", message, config); } catch (Exception e) { log.error("[execute][message({}) config({}) 发送失败]", message, config, e); throw e; } } @Override @SuppressWarnings("resource") protected Channel initProducer(IotDataSinkRabbitMQConfig config) throws Exception { // 1. 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(config.getHost()); factory.setPort(config.getPort()); factory.setVirtualHost(config.getVirtualHost()); factory.setUsername(config.getUsername()); factory.setPassword(config.getPassword()); // 2. 创建连接 Connection connection = factory.newConnection(); // 3. 创建信道 return connection.createChannel(); } @Override protected void closeProducer(Channel channel) throws Exception { if (channel.isOpen()) { channel.close(); } Connection connection = channel.getConnection(); if (connection.isOpen()) { connection.close(); } } }