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
相关推荐
城管不管9 小时前
RabbitMQ死信队列城管不管10 小时前
rabbitmq如何保证消息不丢失?解决方案又是什么?六点_dn1 天前
RabbitMQ学习笔记-部署和使用笨蛋不要掉眼泪1 天前
RabbitMQ消息队列:业务幂等性笨蛋不要掉眼泪1 天前
RabbitMQ消息队列:延迟消息Linux运维技术栈1 天前
业务不停机、数据零丢失:Redis / RabbitMQ / Elasticsearch 三大核心中间件升级改造集群无缝平滑迁移六点_dn1 天前
RabbitMQ常见知识点总结笨蛋不要掉眼泪2 天前
RabbitMQ消息队列:MQ的可靠性笨蛋不要掉眼泪3 天前
RabbitMQ消息队列:发送者的可靠性cyadyx3 天前
RabbitMQ 使用说明文档