RabbitMQ工作模式代码示例及用SpringBoot整合RabbitMQ

news2024/10/6 2:28:22

一,RabbitMQ的工作模式

RabbitMQ 的工作模式是指 RabbitMQ 中不同的消息传递方式,包括简单模式、工作队列模式、发布订阅模式、路由模式和主题模式 。这些工作模式适用于不同的应用场景。详细的文档可参照RabbitMQ的官网:RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ

依赖信息

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itheima</groupId>
    <artifactId>rabbitmq-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.6.0</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

1,简单模式

Simple 简单模式:一个生产者、一个队列、一个消费者,这种交换机是不参与的

 其中P是生产者,C是消费者,红色的为消息队列即 MQ,后面几种模式一样。

生产者端代码:

public class Producer_HelloWorld {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();
        //5.创建队列 Queue
        //如果没有一个名字叫hello_world的队列就会自动创建一个
        /**
         *  queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
         *  queue:队列名称
         *  durable:是否持久化,当mq重启之后还在
         *  exclusive:是否独占,只能有一个消费者监听这个队列或者当connection关闭时,是否删除队列
         *  autoDelete:是否自动删除,当没有consumer时,自动删除掉
         *  arguments:参数
         */
        channel.queueDeclare("hello_world",true,false,false,null);

        String body = "hello rabbitmq";
        //6.发送消息
        /**
         * basicPublish(String exchange, String routingKey, AMQP.BasicProperties props, byte[] body)
         * exchange:交换机名称,简单模式下交换机会使用默认的“”
         * routingKey:路由名称,默认交换机使用队列名称
         * props:配置信息
         * body:发送消息数据
         */
        channel.basicPublish("","hello_world",null,body.getBytes());
        //7.释放资源
        channel.close();
        connection.close();
    }
}

消费者端代码:

public class Consumer_HelloWorld {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();
        //5.创建队列 Queue
        //如果没有一个名字叫hello_world的队列就会自动创建一个
        channel.queueDeclare("hello",true,false,false,null);
        //6.接收消息
        /**
         * basicConsume(String queue, boolean autoAck, Consumer callback)
         * queue:队列名称
         * autoAck:是否自动确认
         * callback:回调对象
         */
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法,当收到消息后会执行这个方法
             * consumerTag:标识
             * envelope:获取一些信息,交换机,路由key...
             * properties:配置信息
             * body:数据
             * @param consumerTag
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag: " +  consumerTag);
                System.out.println("Exchange: " + envelope.getExchange());
                System.out.println("RoutingKey: " + envelope.getRoutingKey());
                System.out.println("properties: " + properties);
                System.out.println("body: " + new String(body));
            }
        };
        channel.basicConsume("hello_world",true,consumer);

        //消费者不需要关闭资源,需要一直监听
    }
}

 2,工作/队列模式

Queue 队列模式:生产者将消息发布到一个队列中,消费者从队列中获取消息

 

生产者端代码:

public class Producer_WorkQueues {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();
        //5.创建队列 Queue
        //如果没有一个名字叫hello_world的队列就会自动创建一个
        channel.queueDeclare("work_queues",true,false,false,null);

        for (int i = 0; i < 10; i++) {
            String body = i + "hello rabbitmq";
            //6.发送消息
            channel.basicPublish("","work_queues",null,body.getBytes());
        }
        //7.释放资源
        channel.close();
        connection.close();
    }
}

消费者端代码:

//消费者1
public class Consumer_WorkQueues1 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();
        //5.创建队列 Queue
        //如果没有一个名字叫hello_world的队列就会自动创建一个
        channel.queueDeclare("work_queues",true,false,false,null);
        //6.接收消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法,当收到消息后会执行这个方法
             * @param consumerTag
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag: " +  consumerTag);
                System.out.println("Exchange: " + envelope.getExchange());
                System.out.println("RoutingKey: " + envelope.getRoutingKey());
                System.out.println("properties: " + properties);
                System.out.println("body: " + new String(body));
            }
        };
        channel.basicConsume("work_queues",true,consumer);

    }
}


//消费者2
public class Consumer_WorkQueues2 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();
        //5.创建队列 Queue
        //如果没有一个名字叫hello_world的队列就会自动创建一个
        channel.queueDeclare("work_queues",true,false,false,null);
        //6.接收消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法,当收到消息后会执行这个方法
             * @param consumerTag
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag: " +  consumerTag);
                System.out.println("Exchange: " + envelope.getExchange());
                System.out.println("RoutingKey: " + envelope.getRoutingKey());
                System.out.println("properties: " + properties);
                System.out.println("body: " + new String(body));
            }
        };
        channel.basicConsume("work_queues",true,consumer);

    }
}

3,直连模式

Direct 直连模式:生产者直接将消息发送到队列中,消费者从队列中获取消息

 生产者端代码:

public class Producer_PubSub {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();

        //5.创建交换机
        /**
         * exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)
         * exchange:交换机名称
         * type:交换机类型 是一个枚举类型
         * durable:是否持久化
         * autoDelete:是否自动删除
         * internal:内部使用,一般设为false
         * arguments:参数,设为null
         */

        String exchangeName = "test_fanout";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true,false,false,null);
        //6.创建队列
        String queueName1 = "queue1";
        String queueName2 = "queue2";
        channel.queueDeclare(queueName1,true,false,false,null);
        channel.queueDeclare(queueName2,true,false,false,null);
        //7.绑定队列和交换机
        /**
         * queueBind(String queue, String exchange, String routingKey)
         * queue:队列名称
         * exchange:交换机名称
         * routingKey:路由键,绑定规则
         *              如果交换机类型为FANOUT类型,则routingKey设为“” 说明交换机会绑定每一个queue
         */
        channel.queueBind(queueName1,exchangeName,"");
        channel.queueBind(queueName2,exchangeName,"");
        //8.发送消息
        String body = "日志信息:数据库被删除";
        channel.basicPublish(exchangeName,"",null,body.getBytes());
        //9.释放资源
        channel.close();
        connection.close();
    }
}

消费者端代码:

//消费者1
public class Consumer_PubSub1 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();

        String queueName1 = "queue1";
        String queueName2 = "queue2";

        //6.接收消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法,当收到消息后会执行这个方法
             * @param consumerTag
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//                System.out.println("consumerTag: " +  consumerTag);
//                System.out.println("Exchange: " + envelope.getExchange());
//                System.out.println("RoutingKey: " + envelope.getRoutingKey());
//                System.out.println("properties: " + properties);
                System.out.println("body: " + new String(body));
                System.out.println("将日志信息打印到控制台..");
            }
        };
        channel.basicConsume(queueName1,true,consumer);
    }
}

//消费者2
public class Consumer_PubSub2 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();

        String queueName1 = "queue1";
        String queueName2 = "queue2";

        //6.接收消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法,当收到消息后会执行这个方法
             * @param consumerTag
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//                System.out.println("consumerTag: " +  consumerTag);
//                System.out.println("Exchange: " + envelope.getExchange());
//                System.out.println("RoutingKey: " + envelope.getRoutingKey());
//                System.out.println("properties: " + properties);
                System.out.println("body: " + new String(body));
                System.out.println("将日志信息保存数据库..");
            }
        };
        channel.basicConsume(queueName2,true,consumer);
    }
}

4,路由模式

 Routing 路由模式:生产者将消息发布到一个交换器上,交换器根据规则将消息路由到目标队列中

 生产者端代码:

public class Producer_Routing {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();

        //5.创建交换机
        /**
         * exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)
         * exchange:交换机名称
         * type:交换机类型 是一个枚举类型
         * durable:是否持久化
         * autoDelete:是否自动删除
         * internal:内部使用,一般设为false
         * arguments:参数,设为null
         */

        String exchangeName = "test_direct";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,false,null);
        //6.创建队列
        String queueName1 = "queue1_direct";
        String queueName2 = "queue2_direct";
        channel.queueDeclare(queueName1,true,false,false,null);
        channel.queueDeclare(queueName2,true,false,false,null);
        //7.绑定队列和交换机
        /**
         * queueBind(String queue, String exchange, String routingKey)
         * queue:队列名称
         * exchange:交换机名称
         * routingKey:路由键,绑定规则
         *              如果交换机类型为FANOUT类型,则routingKey设为“” 说明交换机会绑定每一个queue
         */
        //队列1的绑定  error
        channel.queueBind(queueName1,exchangeName,"error");
        //队列2的绑定  error info
        channel.queueBind(queueName2,exchangeName,"info");
        channel.queueBind(queueName2,exchangeName,"error");
        //8.发送消息
        String body = "日志信息:数据库被删除";
        channel.basicPublish(exchangeName,"error",null,body.getBytes());
        //9.释放资源
        channel.close();
        connection.close();
    }
}

5,通配符模式

Topic 通配符模式:生产者将消息发布到一个主题上,消费者订阅该主题并获取消息

生产者端代码:

 

public class Producer_Topics {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();

        //5.创建交换机
        /**
         * exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)
         * exchange:交换机名称
         * type:交换机类型 是一个枚举类型
         * durable:是否持久化
         * autoDelete:是否自动删除
         * internal:内部使用,一般设为false
         * arguments:参数,设为null
         */

        String exchangeName = "test_topic";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true,false,false,null);
        //6.创建队列
        String queueName1 = "queue1_topic";
        String queueName2 = "queue2_topic";
        channel.queueDeclare(queueName1,true,false,false,null);
        channel.queueDeclare(queueName2,true,false,false,null);
        //7.绑定队列和交换机
        //需求:所有error级别的日志打印控制台和存入数据库,所有order系统的日志存入数据库
        /**
         * queueBind(String queue, String exchange, String routingKey)
         * queue:队列名称
         * exchange:交换机名称
         * routingKey:路由键,绑定规则
         *              如果交换机类型为FANOUT类型,则routingKey设为“” 说明交换机会绑定每一个queue
         */
        //队列1的绑定
        channel.queueBind(queueName1,exchangeName,"#.error");
        channel.queueBind(queueName1,exchangeName,"order.*");
        channel.queueBind(queueName2,exchangeName,"*.*");
        //8.发送消息
        String body = "日志信息:数据库被删除";
        channel.basicPublish(exchangeName,"order.info",null,body.getBytes());
        //9.释放资源
        channel.close();
        connection.close();
    }
}

消费者端代码:

//消费者1
public class Consumer_Topic1 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();

        String queueName1 = "queue1_topic";
        String queueName2 = "queue2_topic";

        //6.接收消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法,当收到消息后会执行这个方法
             * @param consumerTag
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//                System.out.println("consumerTag: " +  consumerTag);
//                System.out.println("Exchange: " + envelope.getExchange());
//                System.out.println("RoutingKey: " + envelope.getRoutingKey());
//                System.out.println("properties: " + properties);
                System.out.println("body: " + new String(body));
                System.out.println("将日志信息打印到控制台..");
            }
        };
        channel.basicConsume(queueName1,true,consumer);
    }
}

//消费者2
public class Consumer_Topic2 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("123.207.72.43");//ip 默认值是localhost
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");//用户名 默认是guest
        factory.setPassword("123");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建 channel
        Channel channel = connection.createChannel();

        String queueName1 = "queue1_topic";
        String queueName2 = "queue2_topic";

        //6.接收消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法,当收到消息后会执行这个方法
             * @param consumerTag
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//                System.out.println("consumerTag: " +  consumerTag);
//                System.out.println("Exchange: " + envelope.getExchange());
//                System.out.println("RoutingKey: " + envelope.getRoutingKey());
//                System.out.println("properties: " + properties);
                System.out.println("body: " + new String(body));
                System.out.println("将日志信息存入数据库..");
            }
        };
        channel.basicConsume(queueName2,true,consumer);
    }
}

二,SpringBoot 整合 RabbitMQ

生产者端整合

步骤:

  1. 创建生产者工程
  2. 添加依赖(也可以在创建 Spring Boot的时候添加依赖);
  3. 添加配置信息;
  4. 编写代码发送消息。

配置rabbitMQ的基本信息:

#配置rabbitmq的基本信息 为了创建连接工厂
spring:
  rabbitmq:
    host: 123.207.72.43
    port: 5672
    username: admin
    password: 123
    virtual-host: /

配置信息(创建一个RabbitMQConfig类):

/**
 * 该类用来创建交换机和队列的 同时将交换机和队列进行绑定
 */

@Configuration
public class RabbitMQConfig {

    //交换机名称
    public static final String EXCHANGE_NAME = "topic_exchange";
    //队列名称
    public static final String QUEUE_NAME = "topic_queue";

    //创建交换机
    @Bean("bootExchange")
    public Exchange bootExchange() {
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }

    //创建队列
    @Bean("bootQueue")
    public Queue bootQueue() {
        return QueueBuilder.durable(QUEUE_NAME).build();
    }

    //将交换机和队列进行绑定

    /**
     * 1.知道哪个队列
     * 2.知道哪个交换机
     * 3.routing key
     * @param queue
     * @param exchange
     * @return
     */
    @Bean
    public Binding bindExchangeQueue(@Qualifier("bootQueue") Queue queue,@Qualifier("bootExchange") Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("boot.#").noargs();
    }
}

编写测试代码发送消息:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ProducerTest {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void send() {
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot.haha","hello rabbitmq");
        System.out.println("消息发送成功!");
    }
}

消费者端整合

步骤:

  1. 创建生产者工程;
  2. 添加依赖(也可以在创建 Spring Boot的时候添加依赖);
  3. 配置整合;
  4. 编写消息监听器。

配置rabbitMQ的基本信息:

#配置rabbitmq的基本信息 为了创建连接工厂
spring:
  rabbitmq:
    host: 123.207.72.43
    port: 5672
    username: admin
    password: 123
    virtual-host: /

编写消息监听器:

@Component
public class RabbitMQListener {
    @RabbitListener(queues = "topic_queue")
    //这里的message对象就是接收到的消息
    public void listenQueue(Message message) {
        System.out.println("message: " + message);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于JavaSwing+MySQL的员工工资管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88042468?spm1001.2014.3001.5503 JDK1.8 MySQL5.7

虚拟与现实的交融:VR与数字孪生的融合之道

VR即虚拟现实&#xff08;Virtual Reality&#xff09;和数字孪生&#xff08;Digital Twin&#xff09;是当今科技领域的两大热门概念&#xff0c;VR以其沉浸式的体验和逼真的虚拟环境&#xff0c;让用户身临其境&#xff0c;开启了全新的交互方式和感官体验&#xff1b;而数字…

副业做什么比较靠谱,不想只靠一个收入

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 如今做一些副业能不能有一点安全感&#xff0c;分享一些可靠的副业&#xff0c;坚持下去&…

Abandoning the Bayer-Filter to See in the Dark 论文阅读笔记

这是CVPR2022的一篇暗图增强的文章&#xff0c;TCL AI Lab与福州大学&#xff0c;韩国延世大学&#xff0c;安徽大学的合作论文网络以黑暗环境下拍摄的color raw为输入&#xff0c;用一个de-bayer-filter module恢复无拜尔滤波器的raw data&#xff08;文章认为拜尔滤波器使得光…

leetcode 987. 二叉树的垂序遍历(java)

二叉树的垂序遍历 leetcode 987. 二叉树的垂序遍历题目描述DFS 优先队列&#xff08;堆&#xff09;代码演示 二叉树专题 leetcode 987. 二叉树的垂序遍历 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/vertical-orde…

AI文本标注的概念,类型和方法

我们每天都在与不同的媒介&#xff08;例如文本、音频、图像和视频&#xff09;交互&#xff0c;我们的大脑对收集到的信息进行处理和加工&#xff0c;从而指导我们的行为。在我们日常接触到的信息中&#xff0c;文本是最常见的媒体类型之一&#xff0c;由我们交流使用的语言构…

优化SQL查询实现高效数据检索(一)

大家好&#xff0c;SQL&#xff08;结构化查询语言&#xff09;可以帮助大家从数据库中收集数据&#xff0c;它是专为此而设计的&#xff0c;换句话说&#xff0c;它使用行和列来处理数据&#xff0c;让使用者能够使用SQL查询来操作数据库中的数据。 SQL查询 SQL查询是一系列…

11-2.箭头函数与函数的this问题

目录 1 箭头函数 1.1 基本使用 1.2 在只有一个参数的时候&#xff0c;小括号可以省略 1.3 只有一行时&#xff0c;可以省略大括号 1.4 只有一行时的return问题 1.5 直接返回一个对象 1.6 箭头函数使用剩余参数 2 this问题 2.1 直接打印this 2.2 fucntion定…

接口工具Postman知多少

目录 前言&#xff1a; Postman简介 如何使用Postman 1&#xff09;主界面 2&#xff09;测试用例的创建 3&#xff09;请求结果 4&#xff09;测试集的创建 使用方法&#xff1a; 前言&#xff1a; Postman是一个流行的API开发和测试工具&#xff0c;它提供了丰富的功…

38. QT在工控机Linux系统上调试机器人注意事项

1. QtCreator项目编译目录问题 当使用QtCreator创建一个新项目之后,对于代码编译产生的最终文件保存路径一般也会确定下来,QtCreator会帮助我们在同级目录下创建保存路径。例如下图:带有蓝色框的文件夹为项目源码,左侧的文件夹即为项目编译后产生的文件夹 如果在某种情况…

Unity | 向量、矩阵、齐次坐标

目录 一、向量点乘&叉乘 1.点乘 1.1 公式 1.2 几何意义 2.叉乘 2.1 公式 2.2 几何意义 二、矩阵点乘&叉乘 1.矩阵 2.矩阵的点乘 3.矩阵的叉乘 三、矩阵旋转 四、齐次坐标 一、向量点乘&叉乘 1.点乘 又称内积&#xff0c;结果是个标量&#xff0c; 1…

LIS医学检验信息系统 智慧检验实验室系统源码

医学检验信息系统(LIS)涵盖实验室的全部管理流程&#xff0c;包括从检验申请、标本采集、实验检测、报告发布的完整流程&#xff0c;以及质控管理、科室事务、试剂管理等功能&#xff0c;遵循医学实验室认可标准ISO15189的要求规范&#xff0c;适合各种实验机构的业务流程。 …

【MySQL】MySQL 数据类型,数值、日期和时间、字符串类型,创建数据表,删除数据表

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制暂停

文章目录 问题场景排查过程处理解决事后反思 问题场景 我们的平台服务使用docker部署&#xff0c;使用docker-compose进行管理&#xff0c;部署到CentOS7的服务器里平台部署到客户环境时&#xff0c;一小部分客户&#xff0c;使用自己机房或单独的服务器。很多客户不愿意采购新…

进程之间的数据交互(使用管道和套接字实现进程通信)

本篇目录 进程通信的方法有哪些C语言使用管道实现进程通信使用管道进行实时通信 C语言使用套接字进行进程通信 进程通信的方法有哪些 进程通信是指在操作系统中&#xff0c;不同进程之间进行数据传递、信息共享和协调工作的方法。以下是常见的进程通信方法&#xff1a; 管道&a…

Linux网络第五章——YUM和NFS共享服务—YUM

YUM简介&#xff1a; 是一个专门为了解决包的依赖关系而存在的软件包管理器。 可以一键下载&#xff0c;一键安装和卸载。yum 是改进型的 RPM 软件管理器&#xff0c; 它解决了 RPM 所面临的软件包依赖问题。 yum 在服务器端存有所有的 RPM 包&#xff0c;并将各个包之间的依…

相比传统ERP,基于项目的ERP系统有何不同?

服务型企业是独特的以人为本的组织&#xff0c;依靠员工来销售、配置和提供一系列的产品和服务&#xff0c;这通常是以项目或合同为基础。 在这样一个环境中&#xff0c;服务型企业的基本财务要求与传统的制造和供应链型企业有很大的不同。 基于项目的企业需要管理资源&#x…

2023最新 Navicat 16.2.3 安装和学习试用连接Redis教程详解

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

IIS8 安装 .net1.1

直接上正文&#xff1b; 一 安装补丁 安装顺序&#xff1a; 1 dotnetfx.exe 2 NDP1.1sp1-KB867460-X86 3 NDP1.1sp1-KB886903-X86 .NET_Framework_Cleanup_Tool.zip&#xff08;这个是卸载.net framework的软件&#xff0c;后面可能会用&#xff09; 链接&#xff1a;ht…

ubuntu软件商店换阿里源,并解决更新源报错-->无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32

目录 一、背景 二、给源文件备份 三、更新源 四、解决报错 五、继续更新源 六、完成更新&#xff0c;下载应用 一、背景 重装了个ubuntu&#xff0c;发现软件商店用不了&#xff0c;打算换源。 二、给源文件备份 1&#xff09;登录ubuntu系统&#xff0c;打开终端&…