|
|
package com.sunyo.wlpt.message.bus.service.rabbit.utils;
|
|
|
|
|
|
import com.sunyo.wlpt.message.bus.service.domain.BusExchange;
|
|
|
import com.sunyo.wlpt.message.bus.service.domain.BusQueue;
|
|
|
import com.sunyo.wlpt.message.bus.service.domain.UserMessageBinding;
|
|
|
import com.rabbitmq.client.AMQP;
|
|
|
import com.rabbitmq.client.Channel;
|
|
|
import com.rabbitmq.client.Connection;
|
|
|
import com.rabbitmq.client.ConnectionFactory;
|
|
|
import com.sunyo.wlpt.message.bus.service.domain.*;
|
|
|
import com.sunyo.wlpt.message.bus.service.service.BusServerService;
|
|
|
import com.sunyo.wlpt.message.bus.service.service.VirtualHostService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.amqp.core.*;
|
|
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
|
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.io.IOException;
|
|
|
import java.util.concurrent.TimeoutException;
|
|
|
|
|
|
/**
|
|
|
* @author 子诚
|
|
|
* Description:
|
|
|
* 时间:2020/7/16 16:32
|
|
|
* 时间:2020/7/30 17:21
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@RefreshScope
|
|
|
@Component
|
|
|
public class RabbitUtils {
|
|
|
|
|
|
@Resource
|
|
|
private AmqpAdmin amqpAdmin;
|
|
|
private VirtualHostService virtualHostService;
|
|
|
|
|
|
@Resource
|
|
|
private RabbitTemplate rabbitTemplate;
|
|
|
private BusServerService busServerService;
|
|
|
|
|
|
@Value("${spring.rabbitmq.host}")
|
|
|
private String host;
|
|
|
|
|
|
@Value("${spring.rabbitmq.port}")
|
|
|
private int port;
|
|
|
|
|
|
@Value("${spring.rabbitmq.username}")
|
|
|
private String username;
|
|
|
|
|
|
@Value("${spring.rabbitmq.password}")
|
|
|
private String password;
|
|
|
|
|
|
@Value("${spring.rabbitmq.virtual-host}")
|
|
|
private String vHost;
|
|
|
|
|
|
/**
|
|
|
* 创建交换机(交换机名称,是否持久化,是否删除)
|
|
|
* 关闭连接与通道
|
|
|
*
|
|
|
* @param busExchange {@link BusExchange}
|
|
|
*/
|
|
|
public void createExchange(BusExchange busExchange) {
|
|
|
|
|
|
// 类型-直连路由
|
|
|
String type_direct = "direct";
|
|
|
// 类型-动态路由
|
|
|
String type_topic = "topic";
|
|
|
// 类型-广播
|
|
|
String type_fanout = "fanout";
|
|
|
// 类型-头部
|
|
|
String type_headers = "headers";
|
|
|
|
|
|
// 创建交换机,直连接类型
|
|
|
if (type_direct.equals(busExchange.getExchangeType())) {
|
|
|
amqpAdmin.declareExchange(
|
|
|
new DirectExchange(busExchange.getExchangeName(), busExchange.getDurability(), busExchange.getAutoDelete())
|
|
|
);
|
|
|
log.info("创建了交换机:{};类型:{};", busExchange.getExchangeType(), type_direct);
|
|
|
}
|
|
|
// 创建交换机,扇形交换机
|
|
|
if (type_topic.equals(busExchange.getExchangeType())) {
|
|
|
amqpAdmin.declareExchange(
|
|
|
new TopicExchange(busExchange.getExchangeName(), busExchange.getDurability(), busExchange.getAutoDelete())
|
|
|
);
|
|
|
log.info("创建了交换机:{};类型:{};", busExchange.getExchangeType(), type_topic);
|
|
|
}
|
|
|
// 创建交换机,广播(主题)交换机
|
|
|
if (type_fanout.equals(busExchange.getExchangeType())) {
|
|
|
amqpAdmin.declareExchange(
|
|
|
new FanoutExchange(busExchange.getExchangeName(), busExchange.getDurability(), busExchange.getAutoDelete())
|
|
|
);
|
|
|
log.info("创建了交换机:{};类型:{};", busExchange.getExchangeType(), type_fanout);
|
|
|
}
|
|
|
// 创建交换机,首部交换机
|
|
|
if (type_headers.equals(busExchange.getExchangeType())) {
|
|
|
amqpAdmin.declareExchange(
|
|
|
new HeadersExchange(busExchange.getExchangeName(), busExchange.getDurability(), busExchange.getAutoDelete())
|
|
|
);
|
|
|
log.info("创建了交换机:{};类型:{};", busExchange.getExchangeType(), type_headers);
|
|
|
* @param channel 通道
|
|
|
* @param conn 连接
|
|
|
*/
|
|
|
public static void closeConnectionAndChanel(Channel channel, Connection conn)
|
|
|
{
|
|
|
try {
|
|
|
if (channel != null) {
|
|
|
channel.close();
|
|
|
}
|
|
|
if (conn != null) {
|
|
|
conn.close();
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建交换机,通过 exchangeName 创建
|
|
|
* 获取 rabbitMq 的连接,重载
|
|
|
*/
|
|
|
public void createExchange(String exchangeName) {
|
|
|
amqpAdmin.declareExchange(
|
|
|
new DirectExchange(exchangeName)
|
|
|
);
|
|
|
log.info("创建了交换机:{};类型:{};", exchangeName, "DirectExchange");
|
|
|
public Connection getConnection() throws IOException, TimeoutException
|
|
|
{
|
|
|
// 定义连接工厂
|
|
|
ConnectionFactory factory = new ConnectionFactory();
|
|
|
// 设置服务地址
|
|
|
factory.setHost(host);
|
|
|
// 端口,amqp协议 端口 类似与mysql的3306
|
|
|
factory.setPort(port);
|
|
|
// 设置账号信息,用户名、密码、vhost
|
|
|
factory.setVirtualHost(vHost);
|
|
|
factory.setUsername(username);
|
|
|
factory.setPassword(password);
|
|
|
// 通过工程获取连接
|
|
|
Connection connection = factory.newConnection();
|
|
|
return connection;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据交换机名称,删除虚拟机
|
|
|
*
|
|
|
* @param exchangeName 交换机名称
|
|
|
* 获取 rabbitMq 的连接,重载
|
|
|
*/
|
|
|
public void deleteExchange(String exchangeName) {
|
|
|
boolean flag = amqpAdmin.deleteExchange(exchangeName);
|
|
|
public Connection getConnection(String virtualHostName) throws IOException, TimeoutException
|
|
|
{
|
|
|
ConnectionFactory factory = new ConnectionFactory();
|
|
|
factory.setHost(host);
|
|
|
factory.setPort(port);
|
|
|
factory.setVirtualHost(virtualHostName);
|
|
|
factory.setUsername(username);
|
|
|
factory.setPassword(password);
|
|
|
Connection connection = factory.newConnection();
|
|
|
return connection;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建队列
|
|
|
*
|
|
|
* @param busQueue {@link BusQueue}
|
|
|
* 获取 rabbitMq 的连接,重载
|
|
|
*/
|
|
|
public void createQueue(BusQueue busQueue) {
|
|
|
amqpAdmin.declareQueue(
|
|
|
new Queue(busQueue.getQueueName(), busQueue.getDurability(), false, busQueue.getAutoDelete())
|
|
|
);
|
|
|
log.info("创建了队列,队列名称->{}", busQueue.getQueueName());
|
|
|
public Connection getConnection(String serverIp, Integer serverPort, String virtualHostName)
|
|
|
throws IOException, TimeoutException
|
|
|
{
|
|
|
ConnectionFactory factory = new ConnectionFactory();
|
|
|
factory.setHost(serverIp);
|
|
|
factory.setPort(serverPort);
|
|
|
factory.setVirtualHost(virtualHostName);
|
|
|
factory.setUsername(username);
|
|
|
factory.setPassword(password);
|
|
|
Connection connection = factory.newConnection();
|
|
|
return connection;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建队列
|
|
|
* 获取 rabbitMq 的连接,重载
|
|
|
*
|
|
|
* @param queueName 队列名称
|
|
|
* @param hostIp 服务器ip
|
|
|
* @param hostPort 服务器端口号
|
|
|
* @param vHostName 虚拟主机名称
|
|
|
* @param userName 用户名
|
|
|
* @param password 密码
|
|
|
* @return
|
|
|
* @throws Exception
|
|
|
*/
|
|
|
public void createQueue(String queueName) {
|
|
|
amqpAdmin.declareQueue(
|
|
|
new Queue(queueName)
|
|
|
);
|
|
|
log.info("创建了队列,队列名称->{}", queueName);
|
|
|
public static Connection getConnection(String hostIp, int hostPort, String vHostName, String userName, String password)
|
|
|
throws Exception
|
|
|
{
|
|
|
ConnectionFactory factory = new ConnectionFactory();
|
|
|
factory.setHost(hostIp);
|
|
|
factory.setPort(hostPort);
|
|
|
factory.setVirtualHost(vHostName);
|
|
|
factory.setUsername(userName);
|
|
|
factory.setPassword(password);
|
|
|
return factory.newConnection();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 删除队列,根据队列名称
|
|
|
*
|
|
|
* @param queueName 队列名称
|
|
|
* 添加交换机
|
|
|
*/
|
|
|
public void deleteQueue(String queueName) {
|
|
|
boolean flag = amqpAdmin.deleteQueue(queueName);
|
|
|
public void createExchange(String serverIp, Integer serverPort, String virtualHostName, BusExchange busExchange)
|
|
|
throws IOException, TimeoutException
|
|
|
{
|
|
|
Connection connection = getConnection(serverIp, serverPort, virtualHostName);
|
|
|
Channel channel = connection.createChannel();
|
|
|
AMQP.Exchange.DeclareOk declareOk = channel.exchangeDeclare(busExchange.getExchangeName(), busExchange.getExchangeType(), busExchange.getDurability(),
|
|
|
busExchange.getAutoDelete(), busExchange.getInternal(), null);
|
|
|
log.info("创建交换机的返回值<----->" + declareOk);
|
|
|
closeConnectionAndChanel(channel, connection);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 删除交换机 channel.exchangeDelete(exchangeName);
|
|
|
*/
|
|
|
public void removeExchange(String serverIp, Integer serverPort, String virtualHostName, BusExchange busExchange)
|
|
|
throws IOException, TimeoutException
|
|
|
{
|
|
|
Connection connection = getConnection(serverIp, serverPort, virtualHostName);
|
|
|
Channel channel = connection.createChannel();
|
|
|
channel.exchangeDelete(busExchange.getExchangeName());
|
|
|
closeConnectionAndChanel(channel, connection);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 添加队列(默认设置参数为null)
|
|
|
*/
|
|
|
public void createQueue(String serverIp, Integer serverPort, String virtualHostName, BusQueue busQueue)
|
|
|
throws IOException, TimeoutException
|
|
|
{
|
|
|
Connection connection = getConnection(serverIp, serverPort, virtualHostName);
|
|
|
Channel channel = connection.createChannel();
|
|
|
channel.queueDeclare(busQueue.getQueueName(), busQueue.getDurability(), false, busQueue.getAutoDelete(), null);
|
|
|
closeConnectionAndChanel(channel, connection);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 删除队列 channel.queueDelete(queueName);
|
|
|
*/
|
|
|
public void removeQueue(String serverIp, Integer serverPort, String virtualHostName, BusQueue busQueue)
|
|
|
throws IOException, TimeoutException
|
|
|
{
|
|
|
Connection connection = getConnection(serverIp, serverPort, virtualHostName);
|
|
|
Channel channel = connection.createChannel();
|
|
|
channel.queueDelete(busQueue.getQueueName());
|
|
|
closeConnectionAndChanel(channel, connection);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建绑定关系
|
|
|
*/
|
|
|
public void createBinding(String serverIp, Integer serverPort, String virtualHostName, UserMessageBinding userMessageBinding)
|
|
|
throws IOException, TimeoutException
|
|
|
{
|
|
|
Connection connection = getConnection(serverIp, serverPort, virtualHostName);
|
|
|
Channel channel = connection.createChannel();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 清空队列 channel.queuePurge(queueName);
|
|
|
*/
|
|
|
|
|
|
/**
|
|
|
* 解除绑定 channel.queueUnbind("queueName", "exchangeName","routingKey");
|
|
|
*/
|
|
|
|
|
|
/**
|
|
|
* 前往创建交换机的路上
|
|
|
*/
|
|
|
public void toCreateExchange(BusExchange busExchange) throws IOException, TimeoutException
|
|
|
{
|
|
|
VirtualHost virtualHost = getVirtualHost(busExchange.getVirtualHostId());
|
|
|
BusServer busServer = getBusServer(virtualHost.getServerId());
|
|
|
createExchange(busServer.getServerIp(), busServer.getServerPort(), virtualHost.getVirtualHostName(), busExchange);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 前往删除交换机的路上
|
|
|
*/
|
|
|
public void toRemoveExchange(BusExchange busExchange) throws IOException, TimeoutException
|
|
|
{
|
|
|
VirtualHost virtualHost = getVirtualHost(busExchange.getVirtualHostId());
|
|
|
BusServer busServer = getBusServer(virtualHost.getServerId());
|
|
|
removeExchange(busServer.getServerIp(), busServer.getServerPort(), virtualHost.getVirtualHostName(), busExchange);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 前往创建队列的路上
|
|
|
*/
|
|
|
public void toCreateQueue(BusQueue BusQueue) throws IOException, TimeoutException
|
|
|
{
|
|
|
VirtualHost virtualHost = getVirtualHost(BusQueue.getVirtualHostId());
|
|
|
BusServer busServer = getBusServer(virtualHost.getServerId());
|
|
|
createQueue(busServer.getServerIp(), busServer.getServerPort(), virtualHost.getVirtualHostName(), BusQueue);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 前往删除队列的路上
|
|
|
*/
|
|
|
public void toRemoveQueue(BusQueue BusQueue) throws IOException, TimeoutException
|
|
|
{
|
|
|
VirtualHost virtualHost = getVirtualHost(BusQueue.getVirtualHostId());
|
|
|
BusServer busServer = getBusServer(virtualHost.getServerId());
|
|
|
removeQueue(busServer.getServerIp(), busServer.getServerPort(), virtualHost.getVirtualHostName(), BusQueue);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据虚拟主机id,获取虚拟主机信息
|
|
|
*
|
|
|
* @param userMessageBinding {@link UserMessageBinding}
|
|
|
* @param virtualHostId 虚拟主机id
|
|
|
* @return {@link VirtualHost}
|
|
|
*/
|
|
|
public void createBing(UserMessageBinding userMessageBinding) {
|
|
|
amqpAdmin.declareBinding(
|
|
|
new Binding(userMessageBinding.getQueueName(), Binding.DestinationType.QUEUE, userMessageBinding.getExchangeName(), userMessageBinding.getRoutingKeyName(), null)
|
|
|
);
|
|
|
log.info("创建了绑定关系,交换机->{};队列->{};路由键->{}", userMessageBinding.getQueueName(), userMessageBinding.getExchangeName(), userMessageBinding.getRoutingKeyName());
|
|
|
public VirtualHost getVirtualHost(String virtualHostId)
|
|
|
{
|
|
|
return virtualHostService.selectByPrimaryKey(virtualHostId);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建绑定关系
|
|
|
* 根据服务器id,获取服务器信息
|
|
|
*
|
|
|
* @param exchangeName 交换机名称
|
|
|
* @param queueName 队列名称
|
|
|
* @param routingKeyName 路由键名称
|
|
|
*/
|
|
|
public void createBing(String exchangeName, String queueName, String routingKeyName) {
|
|
|
amqpAdmin.declareBinding(
|
|
|
new Binding(queueName, Binding.DestinationType.QUEUE, exchangeName, routingKeyName, null)
|
|
|
);
|
|
|
log.info("创建了绑定关系,交换机->{};队列->{};路由键->{}", exchangeName, queueName, routingKeyName);
|
|
|
* @param serverId 服务器id
|
|
|
* @return {@link BusServer}
|
|
|
*/
|
|
|
public BusServer getBusServer(String serverId)
|
|
|
{
|
|
|
return busServerService.selectByPrimaryKey(serverId);
|
|
|
}
|
|
|
} |
...
|
...
|
|