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);
        }
    }
}
相关推荐
神所夸赞的夏天14 小时前
RabbitMQ安装过程
分布式·rabbitmq
phltxy15 小时前
RabbitMQ 常见面试题
分布式·rabbitmq
半夜修仙16 小时前
RabbitMQ入门概述
java·rabbitmq·java-rabbitmq
绝知此事17 小时前
RabbitMQ 从入门到精通:Spring Boot 实战三部曲(三)—— 高级应用与性能优化
spring boot·rabbitmq·java-rabbitmq
绝知此事17 小时前
RabbitMQ 从入门到精通:Spring Boot 实战三部曲(一)—— 基础核心与快速上手
spring boot·rabbitmq·java-rabbitmq
phltxy1 天前
RabbitMQ集群运维:仲裁队列与负载均衡
运维·rabbitmq·负载均衡
Xzh04232 天前
RabbitMQ 核心原理与实战指南:从入门到生产级应用
rabbitmq·rabbit·java-rabbitmq
phltxy3 天前
HAProxy安装与RabbitMQ负载均衡配置
分布式·rabbitmq·负载均衡
开开心心就好3 天前
小白友好的程序联网封锁实用工具
windows·eureka·计算机外设·rabbitmq·word·excel·csdn开发云
phltxy3 天前
RabbitMQ集群搭——多机多节点与单机多节点
分布式·rabbitmq·ruby