rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册

文章目录

  • 1.yaml配置如下
  • 2.引入pom依赖如下
    • 2.1 引入项目resources下libs中的jar包依赖如下
    • 2.2引入maven私服依赖如下
  • 3.启动类配置如下
  • 4.项目中测试发送消息如下
  • 5.项目中消费消息代码示例
  • 6.mq管理后台交换机队列创建及路由绑定关系如下

1.yaml配置如下

   rps中的每一个都可以按照Sping官方的RabbitAutoConfiguration自动装配的RabbitProperties的样式来配置,做到了实现配置多个rabbitMq服务器配置和一个rabbitMq服务器下可以配置多个不同类型的交换机和队列进行绑定,还实现了普通队列发送消息、

    一:延迟插件实现延迟队列

        交换机类型必须CustomExchange

    二:TTL + 死信队列/延迟交换机实现延迟队列

    三: 延迟交换机 + 消息设置setHeader(“x-delay”, xxx)

    以下配置了两个不同的rabbitMq服务器,每一个rabbitMq服务器对应多个队列,还配置了两个相同的rabbitMq服务器,只不过两个相同的rabbitMq服务器有不同的交换机,都是一个rabbitMq服务器可以对应相同的一套配置,代码功能服用性强,也方便快捷

## 配置需要保证唯一不重复(eqps中的每一的index唯一,一般配置成递增的,队列交换机绑定关系的bean注入都是根据rps的List下标+eqps中index下标注入保证了唯一性)
zlf:
  rabbit:
    rps:
      ## 如果virtual-host不同,在配置一个即可,addresses不同也是可以在配置,eqps的下标以之对应上即可
      - rabbitmq:
        virtual-host: /dyict-uat
        addresses: 192.168.40.61
        port: 5672
        username: "admin"
        password: "admin"
      - rabbitmq:
        virtual-host: /test
        addresses: 192.168.40.60
        port: 5672
        username: "admin"
        password: "admin"
      - rabbitmq:
        virtual-host: /test2
        addresses: 192.168.40.60
        port: 5672
        username: "admin"
        password: "admin"
    eqps:
        ## 下标递增且唯一
        - index: 0
          eqs:
            - function-type: Delay
              delay-type: 1
              exchange-type: custom
              exchange-name: zlf.delay.test1
              queue-name: delay.test1
              routing-key: delay.test1.key
              exchange-args:
                x-delayed-type: direct
              queue-args: {}
            - function-type: Normal
              delay-type: 0
              exchange-type: direct
              exchange-name: zlf.normal.test1
              queue-name: normal.test1
              routing-key: normal.test1.key
              exchange-args: {}
              queue-args: {}
            - function-type: Delay
              delay-type: 2
              exchange-type: direct
              exchange-name: zlf.delay.test2
              queue-name: delay.test2
              ## 不用监听正常的队列,直接根据同一个路由键去路由,然后监听死信队列
              routing-key: zlf.delay-test2-key
              dlx-exchange-name: zlf.dlx-test1
              dlx-exchange-type: direct
              dlx-queue-name: dlx-test1
              dlx-key: zlf.dlx-test1-key
              exchange-args: {}
              queue-args:
                x-dead-letter-exchange: zlf.dlx-test1
                x-dead-letter-routing-key: zlf.dlx-test1-key
                ## 单位毫秒 30s
                x-message-ttl: 30000
            - function-type: Delay
              delay-type: 3
              exchange-type: direct
              exchange-name: zlf.delay.test3
              queue-name: delay.test3
              routing-key: zlf.delay-test3-key
              exchange-args: {}
              queue-args: {}

        - index: 1
          eqs:
            - function-type: Delay
              delay-type: 1
              exchange-type: custom
              exchange-name: zlf.delay.test1
              queue-name: delay.test1
              routing-key: delay.test1.key
              exchange-args:
                x-delayed-type: direct
              queue-args: {}
            - function-type: Normal
              delay-type: 0
              exchange-type: direct
              exchange-name: zlf.normal.test1
              queue-name: normal.test1
              routing-key: normal.test1.key
              exchange-args: {}
              queue-args: {}
            - function-type: Delay
              delay-type: 2
              exchange-type: direct
              exchange-name: zlf.delay.test2
              queue-name: delay.test2
              ## 不用监听正常的队列,直接根据同一个路由键去路由,然后监听死信队列
              routing-key: zlf.delay-test2-key
              dlx-exchange-name: zlf.dlx-test1
              dlx-exchange-type: direct
              dlx-queue-name: dlx-test1
              dlx-key: zlf.dlx-test1-key
              exchange-args: {}
              queue-args:
                x-dead-letter-exchange: zlf.dlx-test1
                x-dead-letter-routing-key: zlf.dlx-test1-key
                ## 单位毫秒 30s
                x-message-ttl: 30000
            - function-type: Delay
              delay-type: 3
              exchange-type: direct
              exchange-name: zlf.delay.test3
              queue-name: delay.test3
              routing-key: zlf.delay-test3-key
              exchange-args: {}
              queue-args: {}
        - index: 2
          eqs:
            - function-type: Delay
              delay-type: 1
              exchange-type: custom
              exchange-name: zlf.delay.test1
              queue-name: delay.test1
              routing-key: delay.test1.key
              exchange-args:
                x-delayed-type: direct
              queue-args: {}
            - function-type: Normal
              delay-type: 0
              exchange-type: direct
              exchange-name: zlf.normal.test1
              queue-name: normal.test1
              routing-key: normal.test1.key
              exchange-args: {}
              queue-args: {}
            - function-type: Delay
              delay-type: 2
              exchange-type: direct
              exchange-name: zlf.delay.test2
              queue-name: delay.test2
              ## 不用监听正常的队列,直接根据同一个路由键去路由,然后监听死信队列
              routing-key: zlf.delay-test2-key
              dlx-exchange-name: zlf.dlx-test1
              dlx-exchange-type: direct
              dlx-queue-name: dlx-test1
              dlx-key: zlf.dlx-test1-key
              exchange-args: {}
              queue-args:
                x-dead-letter-exchange: zlf.dlx-test1
                x-dead-letter-routing-key: zlf.dlx-test1-key
                ## 单位毫秒 30s
                x-message-ttl: 30000
            - function-type: Delay
              delay-type: 3
              exchange-type: direct
              exchange-name: zlf.delay.test3
              queue-name: delay.test3
              routing-key: zlf.delay-test3-key
              exchange-args: {}
              queue-args: {}

2.引入pom依赖如下

2.1 引入项目resources下libs中的jar包依赖如下

    右键点击rabbitmq-spring-boot-start-1.0-SNAPSHOT.jar将该jar包手动导入(add as Library),复制该jar包到resources下libs,若果maven自动导入就不用右键手动导入

<dependency>
    <groupId>org.zlf</groupId>
    <artifactId>rabbitmq-spring-boot-start</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/src/main/resources/libs/rabbitmq-spring-boot-start-1.0-SNAPSHOT.jar</systemPath>
</dependency>

2.2引入maven私服依赖如下

<dependency>
    <groupId>org.zlf</groupId>
    <artifactId>rabbitmq-spring-boot-start</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

3.启动类配置如下

@EnableZlfRabbitMq
@Import(value = {RabbitService.class, ZlfMqSpringUtils.class})
@SpringBootApplication(exclude = {
        RabbitAutoConfiguration.class})

4.项目中测试发送消息如下

    Controller测试可以根据rps的下标 + eqps的index下标来复制多个Controlle类,只需要调用api设置这两个下标对应解析即可发送

rabbitService.sendMsg6(0, 0, msg);

rabbitService.sendMsg6(1, 0, msg);

rabbitService.sendMsg6(2, 0, msg);

,,,,,,,,,,

上面配置了三个下标组合就有以下几种:

0 0 / 01 /11

1 0 / 11 /12

2 0 / 21 / 22

可以复制Controller1、Controller2、Controller3,,,,,,,调用时候只需要指定下标组合即可发送消息

package xxxx.controller;

import com.dy.corporate.member.utils.SpringUtils;
import com.zlf.constants.ZlfMqRegistrarBeanNamePrefix;
import com.zlf.service.RabbitService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("rabbit")
public class RabbitMqTestController {

    @Autowired
    private RabbitService rabbitService;

    @GetMapping("/sendDelayMsg")
    public String sendDelayMsg(@RequestParam(value = "msg") String msg) {
        log.info("sendDelayMsg.msg:{}", msg);
        RabbitTemplate rabbitTemplate = (RabbitTemplate) SpringUtils.getBean(ZlfMqRegistrarBeanNamePrefix.rabbitTemplatePrefix + 0);
        rabbitService.sendDelayed(rabbitTemplate, "zlf.delay.test1", "delay.test1.key", msg, 10);
        return "ok";
    }

    @GetMapping("/sendDelayMsg2")
    public String sendDelayMsg2(@RequestParam(value = "msg") String msg) {
        log.info("sendDelayMsg2.msg:{}", msg);
        rabbitService.sendMsg6(0, 0, msg);
        return "ok";
    }

    @GetMapping("/sendNormalMsg")
    public String sendNormalMsg(@RequestParam(value = "msg") String msg) {
        log.info("sendNormalMsg.msg:{}", msg);
        RabbitTemplate rabbitTemplate = (RabbitTemplate) SpringUtils.getBean(ZlfMqRegistrarBeanNamePrefix.rabbitTemplatePrefix + 0);
        rabbitService.sendMsg(rabbitTemplate, "zlf.delay.test1", "delay.test1.key", msg);
        return "ok";
    }

    @GetMapping("/sendNormalMsg2")
    public String sendNormalMsg2(@RequestParam(value = "msg") String msg) {
        log.info("sendNormalMsg2.msg:{}", msg);
        rabbitService.sendMsg6(0, 1, msg);
        return "ok";
    }

    @GetMapping("/sendDelayDlxMsg")
    public String sendDelayDlxMsg(@RequestParam(value = "msg") String msg) {
        log.info("sendDelayDlxMsg.msg:{}", msg);
        RabbitTemplate rabbitTemplate = (RabbitTemplate) SpringUtils.getBean(ZlfMqRegistrarBeanNamePrefix.rabbitTemplatePrefix + 0);
        //正常发延迟交换机和延迟队列的路由键
        rabbitService.sendDelayed(rabbitTemplate, "zlf.delay.test2", "zlf.delay-test2-key", msg, 10);
        return "ok";
    }

    @GetMapping("/sendDelayDlxMsg2")
    public String sendDelayDlxMsg2(@RequestParam(value = "msg") String msg) {
        log.info("sendDelayDlxMsg2.msg:{}", msg);
        //正常发延迟交换机和延迟队列的路由键
        rabbitService.sendDelayed6(0, 2, msg,10);
        return "ok";
    }

    @GetMapping("/sendDelayMsg3")
    public String sendDelayMsg3(@RequestParam(value = "msg") String msg) {
        log.info("sendDelayMsg3.msg:{}", msg);
        rabbitService.sendDelayed6(0, 3, msg, 10);
        return "ok";
    }

}

项目utils下放入SpringUtils类:

package xxx.utils;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @author zlf
 * @description spring上下文工具类
 * @date 2024/03/11
 **/
@Component
public class SpringUtils implements ApplicationContextAware {
    private static final Logger logger = LoggerFactory.getLogger(SpringUtils.class);
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        logger.info("应用程序上下文 : [{}]", "开始初始化");
        SpringUtils.applicationContext = applicationContext;
        logger.info("应用程序上下文 : [{}]", "初始化完成");
    }

    /**
     * 获取applicationContext
     *发给
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

}

以上测试用例MqConsumer都是可以正常消费到对应队列中的消息的

5.项目中消费消息代码示例

    消费者中只需要指定对应的消费监听工厂即可,监听工厂配置如下:

ZlfMqRegistrarBeanNamePrefix.simpleRabbitListenerContainerFactory + rps的下标

可以复制多个MqConsumer1,MqConsumer2,,,,,,,,,

    然后指定对应的监听工厂配置下标即可,经过测试上面三个配置发送4中发送消息,监听消费都是正常的

package xxx.listener;

import com.rabbitmq.client.Channel;
import com.zlf.constants.ZlfMqRegistrarBeanNamePrefix;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 手动ack业务demo
 * long deliveryTag = message.getMessageProperties().getDeliveryTag();
 * try {
 * int a = 1/0;
 * User user = JSONObject.parseObject(userStr,User.class);
 * log.info(user.toString());
 * //手动ack  第二个参数为false是表示仅仅确认当前消息 true表示确认之前所有的消息
 * channel.basicAck(deliveryTag,false);
 * } catch (Exception e) {
 * //手动nack 告诉rabbitmq该消息消费失败  第三个参数:如果被拒绝的消息应该被重新请求,而不是被丢弃或变成死信,则为true
 * try {
 * channel.basicNack(deliveryTag,false,false);
 * } catch (IOException ex) {
 * throw new RuntimeException("消息处理失败");
 * }
 * }
 * //channel.basicNack(); 不ack
 * //channel.basicReject(); 拒绝
 */
@Slf4j
@Component
public class MqConsumer {

    /**
     * 延迟插件实现延迟队列监听队列消息
     *
     * @param message
     * @param channel
     * @throws IOException
     */
    @RabbitHandler
    @RabbitListener(queues = "delay.test1", containerFactory = ZlfMqRegistrarBeanNamePrefix.simpleRabbitListenerContainerFactory + 0)
    public void mqConsumer1(Message message, Channel channel) throws IOException {
        String msg = new String(message.getBody(), "UTF-8");
        try {
            log.info("mqConsumer1=====>msg:{}", msg);
        } catch (Exception e) {
            log.error("mqConsumer1消费异常:{}", e.getMessage());
        } finally {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
        }
        //channel.basicNack(); 不ack
        //channel.basicReject(); 拒绝
    }

    /**
     * 普通队列监听队列消息
     *
     * @param message
     * @param channel
     * @throws IOException
     */
    @RabbitHandler
    @RabbitListener(queues = "normal.test1", containerFactory = ZlfMqRegistrarBeanNamePrefix.simpleRabbitListenerContainerFactory + 0)
    public void mqConsumer2(Message message, Channel channel) throws IOException {
        String msg = new String(message.getBody(), "UTF-8");
        try {
            log.info("mqConsumer2=====>msg:{}", msg);
        } catch (Exception e) {
            log.error("mqConsumer2消费异常:{}", e.getMessage());
        } finally {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
        }
    }

    /**
     * TTL + 死信队列实现延迟队列监听延迟队列消息(此处省略)
     * 绑定的那个延迟队列,消息如果正常消费,则不会将消息投递到死信队列上,
     * 只有消息变成死信才会被投递到死信队列上
     */


    /**
     * TTL + 死信队列实现延迟队列监听死信队列消息
     * 成为死信的条件
     * * 1.队列消息长度到达限制。
     * * 2.消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false。
     * * 3.原队列存在消息过期设置,消息到达超时时间未被消费。
     *
     * @param message
     * @param channel
     * @throws IOException
     */
    @RabbitHandler
    @RabbitListener(
            //监听连接工程指定
            containerFactory = ZlfMqRegistrarBeanNamePrefix.simpleRabbitListenerContainerFactory + 0,
            bindings = @QueueBinding(
                    //延迟交换机
                    exchange = @Exchange(
                            value = "zlf.delay.test2",
                            //持久化参数设置
                            durable = "true",
                            //交换机类型指定
                            type = ExchangeTypes.DIRECT),
                    //延迟交换机路由延迟队列的key
                    key = "zlf.delay-test2-key",
                    //死信队列
                    value = @Queue(
                            value = "dlx-test1",
                            //持久化参数设置
                            durable = "true"
                            //, //autoDelete = "false",
                    )
                    //ignoreDeclarationExceptions = "true"
            )
            //,
            //concurrency = "1", // 指定监听该队列的消费者个数
            //ackMode = "MANUAL"// 手动ack
    )
    public void mqConsumer4(Message message, Channel channel) throws IOException {
        String msg = new String(message.getBody(), "UTF-8");
        try {
            log.info("mqConsumer4=====>msg:{}", msg);
        } catch (Exception e) {
            log.error("mqConsumer4:{}", e.getMessage());
        } finally {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
        }
    }

    /**
     * 延迟交换机 + 消息设置setHeader("x-delay", xxx)
     *
     * @param message
     * @param channel
     * @throws IOException
     */
    @RabbitHandler
    @RabbitListener(queues = "delay.test3", containerFactory = ZlfMqRegistrarBeanNamePrefix.simpleRabbitListenerContainerFactory + 0)
    public void mqConsumer5(Message message, Channel channel) throws IOException {
        String msg = new String(message.getBody(), "UTF-8");
        try {
            log.info("mqConsumer5=====>msg:{}", msg);
        } catch (Exception e) {
            log.error("mqConsumer5消费异常:{}", e.getMessage());
        } finally {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
        }
        //channel.basicNack(); 不ack
        //channel.basicReject(); 拒绝
    }

}

6.mq管理后台交换机队列创建及路由绑定关系如下

    以下交换机和队列定义的时候都是持久化的,上面三个配置示都在rabbitMq的管理后台生成了相同的队列、交换机和绑定关系(唯一不一样的是错误对了是根据rps的List的下标来的,保证唯一),以下截图只展示一个即rps[0]的交换机、队列和绑定关系的创建,其它两个都是一样的(唯一不同就是错误队列交换机是后缀角标是递增的)。

zlf.delay.test1交换机(延迟插件)

img

zlf.delay.test1交换和delay.test1队列的绑定关系:

img

zlf.normal.test1交换机(普通交换机)

img

zlf.normal.test1交换机和normal.test1的绑定关系:

img

zlf.delay.test2交换机:(ttl + 死信队列)

img

zlf.delay.test2交换机和delay.test2绑定关系:

img

zlf.dlx-test1交换机:(死信交换机)

img

zlf.dlx-test1死信交换机和dlx-test1绑定关系:

img

zlf.delay.test3交换机:

img

zlf.delay.test3交换机delay.test3的绑定关系:

img

error交换机

error.direct + 一个下标,类型、路由键是固定

img

error.direct + 一个下标 和 error.queue+ 一个下标 的绑定关系:

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/453234.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java算法总结之冒泡排序(详解)

程序代码园发文地址&#xff1a;Java算法总结之冒泡排序&#xff08;详解&#xff09;-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,Java算法总结之冒泡排序&#xff08;详解&#xff09;http://www.byqws.com/blog/3145.html?sourcecsdn 冒泡排序…

(day 7)JavaScript学习笔记(函数1)

概述 这是我的学习笔记&#xff0c;记录了JavaScript的学习过程&#xff0c;我是有一些Python基础的&#xff0c;因此在学习的过程中不自觉的把JavaScript的代码跟Python代码做对比&#xff0c;以便加深印象。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过J…

社媒营销会遇到的封号问题

最近看到很多的直播都在教伙伴们怎么用linked in 以及facebook开发客户&#xff0c;比如如何添加联系人&#xff0c;如何用添加好友的话术&#xff0c;如何加群&#xff0c;如何分析客户的背景等等。 有的主播只是讲一些表面的东西&#xff0c;有的主播可能是真的肚子里有货&a…

【DataWhale学习】用免费GPU线上跑StableDiffusion项目实践

用免费GPU线上跑SD项目实践 ​ DataWhale组织了一个线上白嫖GPU跑chatGLM与SD的项目活动&#xff0c;我很感兴趣就参加啦。之前就对chatGLM有所耳闻&#xff0c;是去年清华联合发布的开源大语言模型&#xff0c;可以用来打造个人知识库什么的&#xff0c;一直没有尝试。而SD我…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:StepperItem)

用作Stepper组件的页面子组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 接口 StepperItem() 属性 参数名参数类型参数描述prevLabelstring设置左侧文本按钮内…

硬件软件_驱动程序只有cat,inf,sys,怎么安装?

硬件软件_驱动程序只有cat&#xff0c;inf&#xff0c;sys&#xff0c;怎么安装&#xff1f; 右键点击inf文件 -》 安装 即可完成。

文件外发管理软件(控制文件外发的软件·精选推荐)

无论是与合作伙伴共享资料、还是员工需要在家办公时访问公司内部文件&#xff0c;文件的外发都是必要的。然而&#xff0c;这也带来了数据泄露的风险。 如果没有有效的管理手段&#xff0c;敏感信息可能会被未授权的人员获取&#xff0c;进而对企业的商业机密、客户隐私和知识…

Excel查找函数的高级用法

查找在实际工作中是经常遇到的&#xff0c;那你会查找吗&#xff1f;本期与大家分享6个查找函数技巧。 一、查找的基础用法 1、根据内容查找相应的行数 想知道数据在区域中的位置&#xff0c;可以用MATCH函数。 举个例子&#xff0c;查找“刘冰”在姓名列中所在的函数。 输…

Web-based DBMS Technology 线上数据库

Example Online Databases • https://www.planespotters.net/ • https://www.comics.org/ • https://www.quandl.com/ • https://www.enigma.com/ • https://www.sportradar.com/ Basics of WWW • The Web is a very large client-server system — Connected through r…

Anaconda的使用及spyder相关设置

Anaconda Anaconda是一个Python发行版&#xff0c;主要用于数据科学和机器学习领域。Anaconda集成了许多常用的数据科学工具和库&#xff0c;如NumPy、Pandas、Scikit-learn等&#xff0c;同时还包含了一个强大的包管理器conda和一个集成开发环境Spyder。Anaconda的目标是提供一…

电脑回收站图标更改

小猫图标 效果图 1.下载压缩包 https://www.123pan.com/s/9QRqVv-u3lY.html 解压后得到两个文件 coo.dll&#xff08;满&#xff09; ooo.dll&#xff08;空&#xff09;把这两个文件放到C盘的图片文件夹中 2.更改图标 wini打开设置&#xff0c;选择个性化&#xff0c…

Python学习笔记1:Pycharm首次安装环境搭建汉化

Pycharm首次安装环境搭建汉化笔记 1.下载网址 首先下载专业版的pycharm&#xff0c;这里建议下载专业版是因为功能更全面&#xff0c;社区版的往往没有远程调控等实践功能。 网址贴在下方&#xff1a; https://www.jetbrains.com/pycharm/download/?sectionwindows •Profe…

Vue3组件详情

Vue3组件详情 一、父组件向子组件传值 ref、props二、子组件向父组件传值 emit三、子组件向父组件传值 v-model四、setup语法糖1、基本用法2、data和methods3、计算属性 computed4、监听器 watch、watchEffect5、自定义指令 directive6、import导入的内容可以直接使用7、声明pr…

【Docker】使用Docker部署IT运维管理平台CAT

作者怀揣着一个美好的愿景&#xff0c;旨在提升管理效率、推动开源项目的蓬勃发展。 来一杯咖啡与茶&#xff0c;为 IT 运维从业者减轻管理负担&#xff0c;提升管理效率&#xff0c;从繁重无序的工作中解压出来&#xff0c;利用剩余时间多喝一杯休息一下。 这是一个专为 IT 运…

英伟达推出免训练,可生成连贯图片的文生图模型ConsiStory,生成角色一致性解决新方案

目前&#xff0c;多数文生图模型皆使用的是随机采样模式&#xff0c;使得每次生成的图像效果皆不同&#xff0c;在生成连贯的图像方面非常差。 例如&#xff0c;想通过AI生成一套图像连环画&#xff0c;即便使用同类的提示词也很难实现。虽然DALLE 3和Midjourney可以对图像实现…

k8s+zabbix

一&#xff0c;环境&#xff1a; 1&#xff09;&#xff0c;k8s部署&#xff0c;master和node节点都部署成功 二&#xff0c;部署&#xff1a; 1&#xff09;&#xff0c;安装python3&#xff08;资源中有&#xff09; wget https://www.python.org/ftp/python/3.7.4/Python-…

【Python】新手入门学习:详细介绍组合/聚合复用原则(CARP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍组合/聚合复用原则&#xff08;CARP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集…

为什么选择VR全景进行企业宣传,如何将VR全景运用在企业展示

引言&#xff1a; 随着科技的不断发展&#xff0c;VR全景技术逐渐成为企业宣传的热门选择。那么&#xff0c;为什么越来越多的企业选择使用VR全景技术进行宣传呢&#xff1f; 一&#xff0e;为什么选择VR全景技术进行企业宣传 1. 提升用户体验 VR全景技术可以为用户营造身临…

c++函数SetConsoleTextAttribute

前言 正文 1.作用&#xff1a; 2.函数格式(重点)&#xff1a; 3.参数(重点)&#xff1a; 前言 实用(真的) 正文 1.作用&#xff1a; 更改cmd的背景色与字体颜色 2.函数格式(重点)&#xff1a; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),10进制参数); …

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展&#xff0c;固态硬盘&#xff08;Solid State Drive&#xff0c;简称SSD&#xff09;已成为现代电脑的标配。相较于传统的机械硬盘&#xff0c;固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是&#xff0c;对于不熟悉电脑硬件的用户来说&#xff0…