43.MQ—RabbitMQ

本文详细介绍了RabbitMQ的基本概念,包括同步和异步调用的区别,以及如何在Docker中部署和管理RabbitMQ。内容涵盖了基础消息队列的实现、工作队列、发布订阅模式(FanoutExchange、DirectExchange和TopicExchange)以及SpringAMQP的应用。

目录

一、MQ—RabbitMQ。

(1)同步调用与异步调用。

(1.1)同步调用。

(1.2)异步调用。

(2)MQ之间的区别。

(3)RabbitMQ学习。

(3.1)docker下载rabbitmq容器,并启动。

(3.2)RabbitMQ中的几个概念。

(3.3)常见消息模型。

(3.4)常见消息模型学习。

(3.4.1)基础消息队列(代码实现)。

(3.4.2)基础消息队列(RabbitTemplate模板实现)。

(3.4.3)work Queue工作队列。

(3.4.4)发布订阅-Fanout Exchange。

(3.4.5)发布订阅-DirectExchange。

(3.4.6)发布订阅-TopicExchange。

(3.5)消息转换器。


一、MQ—RabbitMQ。

(1)同步调用与异步调用。

(1.1)同步调用。

(1.2)异步调用。

(2)MQ之间的区别。

(3)RabbitMQ学习。

(3.1)docker下载rabbitmq容器,并启动。

下载容器: 

docker pull rabbitmq:3-management

启动容器:

docker run \
 -e RABBITMQ_DEFAULT_USER=itcast \
 -e RABBITMQ_DEFAULT_PASS=123321 \
 --name mq \
 --hostname mq1 \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3-management

浏览器访问:

(3.2)RabbitMQ中的几个概念。

(3.3)常见消息模型。

(3.4)常见消息模型学习。

提示:AMQP是协议,SpringAMQP是基于AMQP实现的一套API。 

(3.4.1)基础消息队列(代码实现)。

消息发送:

public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.150.101");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("itcast");
        factory.setPassword("123321");
        // 1.2.建立连接
        Connection connection = factory.newConnection();
        // 2.创建通道Channel
        Channel channel = connection.createChannel();
        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);
        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");
        // 5.关闭通道和连接
        channel.close();
        connection.close();
    }
}

消息接收:

public class ConsumerTest {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.150.101");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("itcast");
        factory.setPassword("123321");
        // 1.2.建立连接
        Connection connection = factory.newConnection();
        // 2.创建通道Channel
        Channel channel = connection.createChannel()
        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);
        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
}

(3.4.2)基础消息队列(RabbitTemplate模板实现)。

(3.4.3)work Queue工作队列。

与simple的区别:多了一个设置消费预存限制。

(3.4.4)发布订阅-Fanout Exchange。

提示:绑定键使用空字符串,就可以完成广播(发给所有绑定该交换机的队列)。 

(3.4.5)发布订阅-DirectExchange。

提示:需要提供绑定键(路由键),根据  交换机+绑定键  映射。 

(3.4.6)发布订阅-TopicExchange。

(3.5)消息转换器。

<think>嗯,用户问的是Spring中@Value和@PostConstruct的加载顺序。首先,我需要回忆一下Spring的生命周期。记得在Bean的初始化过程中,依赖注入之后才会执行初始化方法,比如@PostConstruct。 那具体来说,@Value是通过后置处理器处理的,属于依赖注入的一部分。所以当Bean实例化后,Spring会处理所有的注入操作,包括@Autowired、@Value这些注解。这时候,字段已经被赋值了。 接下来,才会执行@PostConstruct标记的方法。所以在process方法里,使用host等字段时,这些字段已经被@Value注入了值。因此,它们的加载顺序应该是@Value先执行,然后才是@PostConstruct的方法。 不过要注意,如果@Value的值来自配置,比如${...},这时候需要确保配置是否正确加载,否则可能导致注入失败。比如配置文件中没有对应的属性,或者环境变量没设置好,这时候@Value可能会注入默认值或者报错,影响后续的@PostConstruct方法中的逻辑。 另外,如果有其他后处理器,比如自定义的BeanPostProcessor,可能会影响这个顺序,但通常情况下,Spring的标准处理流程是先完成所有依赖注入,再调用初始化方法。所以用户提供的代码中,process方法里的host等变量应该已经被正确赋值了。</think>在Spring框架中,`@Value`字段注入和`@PostConstruct`方法的执行顺序遵循以下规则: ### 加载顺序说明 1. **字段注入优先**:所有`@Value`、`@Autowired`等依赖注入操作会在Bean初始化阶段最先完成 2. **后执行初始化方法**:`@PostConstruct`标注的方法会在所有依赖注入完成后执行 ### 代码示例验证 ```java @Component public class InjectionOrderExample { @Value("${example.value}") private String injectedValue; public InjectionOrderExample() { System.out.println("构造函数执行时 injectedValue = " + injectedValue); // null } @PostConstruct public void init() { System.out.println("@PostConstruct执行时 injectedValue = " + injectedValue); // 实际值 System.out.println("当前值:" + injectedValue); } } ``` ### 执行结果分析 ``` 构造函数执行时 injectedValue = null @PostConstruct执行时 injectedValue = actual_value 当前值:actual_value ``` ### 关键结论 - 字段注入发生在对象实例化之后、初始化方法之前 - 在`@PostConstruct`方法中可以安全使用`@Value`注入的值 - 构造函数中不能使用未完成注入的字段值
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值