Rabbitmq发消息工具类

复制代码
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

@Component
@Slf4j
public class RabbitCallbackMqUtils implements AutoCloseable {

    @Value("${rabbitmq.callback.host}")
    private String callbackHost;

    @Value("${rabbitmq.callback.port}")
    private Integer callbackPort;

    @Value("${rabbitmq.callback.username}")
    private String callbackUsername;

    @Value("${rabbitmq.callback.password}")
    private String callbackPassword;

    @Value("${rabbitmq.callback.virtual-host}")
    private String callbackVirtualHost;

    @Value("${rabbitmq.callback.exchange}")
    private String callbackExchange;

    @Value("${rabbitmq.callback.queue}")
    private String callbackQueue;

    @Value("${rabbitmq.callback.routing.key}")
    private String callbackRoutingKey;

    private Connection connection;

    private Channel channel;

    /**
     * 发送对象消息
     *
     * @param obj
     */
    public void sendObjectMessage(Object obj) {
        try {
            if (!isHostReachable(callbackHost, callbackPort, 2000)) {
                log.error("MQ服务器无法访问:{}:{}", callbackHost, callbackPort);
                return;
            }
            if (connection == null || !connection.isOpen()) {
                initConnection();
            }
            // 对象转 JSON
            String json = JacksonUtil.toJson(obj);
            if (StringUtils.isNotBlank(json)) {
                channel.basicPublish(callbackExchange, callbackRoutingKey, null, json.getBytes(StandardCharsets.UTF_8));
            }
            log.info("回调消息发送成功:{}", json);
        } catch (Exception e) {
            log.error("回调消息发送失败", e);
        }
    }

    /**
     * 初始化连接
     *
     * @throws Exception
     */
    private void initConnection() throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(callbackHost);
        factory.setPort(callbackPort);
        factory.setUsername(callbackUsername);
        factory.setPassword(callbackPassword);
        factory.setVirtualHost(callbackVirtualHost);
        factory.setConnectionTimeout(3000);
        factory.setHandshakeTimeout(3000);
        this.connection = factory.newConnection();
        this.channel = connection.createChannel();
        channel.exchangeDeclare(callbackExchange, "direct", true);
        channel.queueDeclare(callbackQueue, true, false, false, null);
        channel.queueBind(callbackQueue, callbackExchange, callbackRoutingKey);
        log.info("RabbitMQ 回调连接初始化成功");
    }


    /**
     * 判断 IP:端口 是否能通
     *
     * @param host
     * @param port
     * @param timeoutMillis
     * @return
     */
    private boolean isHostReachable(String host, int port, int timeoutMillis) {
        try (Socket socket = new Socket()) {
            socket.connect(new java.net.InetSocketAddress(host, port), timeoutMillis);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    @Override
    public void close() {
        try {
            if (channel != null && channel.isOpen()) {
                channel.close();
            }
            if (connection != null && connection.isOpen()) {
                connection.close();
            }
        } catch (Exception e) {
            log.error("关闭连接异常", e);
        }
    }
}
相关推荐
j7~3 天前
【C++标准项目】C++基于protobuf的发布订阅式消息队列(篇一):项目概述+环境搭建
分布式·消息队列·rabbitmq·gtest·protobuf·muduo·sqlites
仍然.4 天前
RabbitMQ---可靠性传输
网络·分布式·rabbitmq
灯澜忆梦4 天前
【RabbitMQ #13】 | 延迟消息
分布式·rabbitmq·ruby
灯澜忆梦5 天前
【RabbitMQ #11】 | 消费者可靠性
分布式·rabbitmq·ruby
仍然.5 天前
RabbitMQ---事务和消息分发
分布式·rabbitmq
灯澜忆梦5 天前
【RabbitMQ #9】 | 生产者可靠性
分布式·rabbitmq
灯澜忆梦5 天前
【RabbitMQ #10】 | MQ可靠性
分布式·rabbitmq
醉颜凉6 天前
Kafka 与 RabbitMQ/RocketMQ 选型对比:场景匹配、性能基准与迁移成本
kafka·消息队列·rabbitmq·rocketmq·中间件选型
灯澜忆梦6 天前
【RabbitMQ #5】 | 三大交换机 Fanout ,Direct ,Topic
分布式·rabbitmq·ruby
灯澜忆梦7 天前
【RabbitMQ #3】 | Go 客户端 + SpringAMQP
分布式·golang·rabbitmq