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
相关推荐
JLWcai202510097 天前
铸造领域树脂砂轮|金利威多场景解决方案,20 + 配方覆盖全需求风吹夏回7 天前
RabbitMQ 核心术语 + Python pika 方法完整讲解风吹夏回7 天前
RabbitMQ 三种模式入门:HelloWorld、WorkQueue、PubSubcheems95277 天前
[RabbitMQ高级特性] 消息确认机制:从 Ready / Unacked 到 basicAck、basicReject、basicNack 的底层拆解半夜修仙8 天前
延迟队列的介绍及常见问题Solis程序员8 天前
Raft:分布式系统的定海神针手握风云-8 天前
一条消息的旅程:RabbitMQ 学习与实践(一)Zyangxsir8 天前
RabbitMQ 核心概念以及Java(Spring Boot)实战用法的整理南部余额9 天前
RabbitMQ 进阶:延迟队列完全指南开开心心_Every9 天前
界面干净的开源免费电视浏览器