1.场景案例
项目过程中我们应用到的MQ比较多一些例如设备之间的实时通信、后台服务向前端WEB实时传输消息,
不过我们在项目初期要定义一些MQ的交换机绑定队列,可以在页面控制台上进行添加,但是我们产品部署现场的时候可不能给甲方进行一步一步的操作所以要做初始化工厂作为数据总线来维护我们项目中的所有MQ管理。
2.实例应用-建表操作
我们用数据库作为存储,将来WEB端也可以给我们提供页面进行增加删除MQ的控制;
建表定义-交换机(exchange)、队列(query)、交互机模式、路由键(ROUTINGKEY)
CREATE TABLE `tab_mq_configuration_center` (
`S_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`S_EXGNAME` varchar(36) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '交换机名称',
`S_DIRECT` varchar(36) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '交互机模式',
`S_QUEUE_NAME` varchar(36) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '队列名称',
`S_ROUTINGKEY` varchar(36) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '路由键',
`S_EXTEND_INFO` longtext COLLATE utf8mb4_czech_ci COMMENT '扩展属性',
`CREATE_TIME` datetime DEFAULT NULL COMMENT '创建日期',
`UPDATE_TIME` datetime DEFAULT NULL COMMENT '修改日期',
`CREATE_BY` varchar(36) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '创建者',
`UPDATE_BY` varchar(36) COLLATE utf8mb4_czech_ci DEFAULT NULL COMMENT '更新者',
`OBJECT_VERSION` int(10) DEFAULT NULL COMMENT '版本号',
`I_DELETE_FLAG` tinyint(2) DEFAULT '0' COMMENT '删除标识(0:正常 1:删除)',
PRIMARY KEY (`S_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;
3.初始化MQ工厂工具类
@Component
@NoArgsConstructor
public class RabiitMqConfigUntil {
@Value("${spring.rabbitmq.host}")
private String host = null;
@Value("${spring.rabbitmq.port}")
private Integer port = null;
@Value("${spring.rabbitmq.username}")
private String userName = null;
@Value("${spring.rabbitmq.password}")
private String password = null;
@Autowired
private TabMvMqConfigurationCenterService tabMvMqConfigurationCenterService;
public static RabiitMqConfigUntil rabiitMqConfigUntil;
@PostConstruct
public void init() {
rabiitMqConfigUntil = this;
rabiitMqConfigUntil.tabMvMqConfigurationCenterService = this.tabMvMqConfigurationCenterService;
}
/**
* @description: MQ配置初始化
* @param tabMvMqConfigurationCenterEntityList
* @author panlupeng
* @date 2021/8/25 10:10
*/
public void msgInit(List<TabMvMqConfigurationCenterEntity> tabMvMqConfigurationCenterEntityList){
//创建连接工厂
ConnectionFactory cf = new ConnectionFactory();
cf.setHost(host);
cf.setPort(port);
cf.setUsername(userName);
cf.setPassword(password);
//获取连接
try{
Connection con = cf.newConnection();
if(CollectionUtils.isEmpty(tabMvMqConfigurationCenterEntityList)){
Map<String, Object> params=new HashMap<>();
params.put("page","1");
params.put("limit","999");
PageUtils pageUtils = rabiitMqConfigUntil.tabMvMqConfigurationCenterService.queryPage(params);
tabMvMqConfigurationCenterEntityList = (List<TabMvMqConfigurationCenterEntity>) pageUtils.getList();
}
if(!CollectionUtils.isEmpty(tabMvMqConfigurationCenterEntityList)){
for (TabMvMqConfigurationCenterEntity tabMvMqConfigurationCenterEntity : tabMvMqConfigurationCenterEntityList) {
try{
//创建一消息通道
Channel channel = con.createChannel();
//定义交换机
String exgName = tabMvMqConfigurationCenterEntity.getSExgname();
//direct(直连),topic,fanout,headers
channel.exchangeDeclare(exgName, tabMvMqConfigurationCenterEntity.getSDirect());
//定义队列
String queue = tabMvMqConfigurationCenterEntity.getSQueueName();
boolean durable = false; //是否持久化
boolean exclusive = false; //排他 只能连接一个
boolean autoDelete = false;//自动删除
channel.queueDeclare(queue, durable, exclusive, autoDelete, null);
//绑定交换机与队列
String routingKey = tabMvMqConfigurationCenterEntity.getRoutingkey();
channel.queueBind(queue, exgName, routingKey);
channel.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* @description: 删除MQ配置信息
* @param tabMvMqConfigurationCenterEntityList
* @author panlupeng
* @date 2021/8/25 11:14
*/
public void delMQConfig(List<TabMvMqConfigurationCenterEntity> tabMvMqConfigurationCenterEntityList){
//1.创建连接工厂
ConnectionFactory cf = new ConnectionFactory();
cf.setHost(host);
cf.setPort(port);
cf.setUsername(userName);
cf.setPassword(password);
//2.获取连接
try{
Connection con = cf.newConnection();
if(!CollectionUtils.isEmpty(tabMvMqConfigurationCenterEntityList)){
for (TabMvMqConfigurationCenterEntity tabMvMqConfigurationCenterEntity : tabMvMqConfigurationCenterEntityList) {
try{
Channel channel = con.createChannel();
//删除通道
channel.queueDelete(tabMvMqConfigurationCenterEntity.getSQueueName());
//删除交换机
channel.exchangeDelete(tabMvMqConfigurationCenterEntity.getSExgname());
channel.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
建立工厂之后在SpringBoot启动之后就可以进行初始化(此工具类涵盖了删除交换机的操作作为公共之后页面进行MQ操作的扩展)
在启动之后再去看管理台就可以看到我们数据库所有的MQ配置都上传到了MQ管理中心