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);
}
}
}
Rabbitmq发消息工具类
qingcyb2026-04-01 8:32
相关推荐
山城码农笑松哥4 小时前
Rocky Linux Centos 9.6 完全离线安装rabbitmq4.2少许极端4 小时前
消息队列3-RabbitMQ的高级特性-可靠性保证机制糖炒栗子03261 天前
后端异步任务编排:基于 RabbitMQ 的“中控-工人”模式真上帝的左手1 天前
12. 消息队列-RabbitMQ-Spring Boot 集成 RabbitMQjiajia_lisa1 天前
不止是识别,OCR重新定义文档管理新方式qq_40999093?2 天前
消息中间件:RabbitMQ、RocketMQ、Kafka快速上手iPadiPhone3 天前
分布式架构的“润滑剂”:RabbitMQ 核心原理与大厂面试避坑指南安审若无4 天前
【无标题】真上帝的左手4 天前
12. 消息队列-RabbitMQ-高可用队列详解