StringBoot与RabbitMQ的简单入门 - 生产者和消费者(Producer/Consumer)

本文详细介绍如何在SpringBoot项目中整合RabbitMQ,包括创建项目、配置pom.xml依赖、理解RabbitMQ模型及各组件功能。通过具体代码示例,展示了如何配置Exchange、Queue、Binding,并实现消息的生产和消费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 创建SpringBoot项目

参照Spring官网,可快速创建一个SpringBoot的项目。

pom.xml的文件

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

启动成功后如下:

二,  了解RabbitMQ的模型

概念解释
Broker即RabbitMQ的实体服务器。提供一种传输服务,维护一条从生产者到消费者的传输线路,
保证消息数据能按照指定的方式传输
Exchange消息交换机,指定消息按照什么规则路由到哪个队列Queue
Queue消息队列,消息的载体,每条消息都会被投送到一个或多个队列中
Binding绑定。作用就是将Exchange和Queue按照某种路由规则绑定起
Routing
Key
路由关键字。Exchange根据Routing Key进行消息投递。定义绑定时指定的关键字称为
Binding Key
Vhost虚拟主机。一个Broker可以有多个虚拟主机,用作不同用户的权限分离。一个虚拟主机持有
一组Exchange、Queue和Binding。
Producer消息生产者。主要将消息投递到对应的Exchange上面。一般是独立的程序
Consumer消息消费者。消息的接收者,一般是独立的程序
ConnectionProducer 和 Consumer 与Broker之间的TCP长连接。
Channel消息通道,也称信道。在客户端的每个连接里可以建立多个Channel,每个Channel代表一
个会话任务。在RabbitMQ Java Client API中,channel上定义了大量的编程接口。

 

 

 

 

 

 

 

 

 

 

 

 

 

Consumer

***************************************************************************************************************************

@Configuration
public class RabbitConfig {

    @Bean("firstQueue")
    public Queue getFirstQueue(){ return new Queue("FIRST_QUEUE");}

    @Bean("secondQueue")
    public Queue getSecondQueue(){ return new Queue("SECOND_QUEUE");}

    @Bean("thirdQueue")
    public Queue getThirdQueue(){ return new Queue("THIRD_QUEUE");}

    @Bean("fourthQueue")
    public Queue getFourthQueue(){ return new Queue("FOURTH_QUEUE");}


    @Bean("topicExchange")
    public TopicExchange getTopicExchange(){return new TopicExchange("TOPIC_EXCHANGE");}

    @Bean("directExchange")
    public DirectExchange getSecondDirectExchange(){return new DirectExchange("DIRECT_EXCHANGE");}

    @Bean("fountExchange")
    public FanoutExchange getHarryFountExchange(){return new FanoutExchange("FOUNT_EXCHANGE");}

    @Bean
    public Binding bingFirst(@Qualifier("topicExchange") TopicExchange exchange,
                              @Qualifier("firstQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("*.ginny.*");
    }

    @Bean
    public Binding bingSecond(@Qualifier("directExchange") DirectExchange exchange,
                             @Qualifier("secondQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("ginny.test");
    }

    @Bean
    public Binding bingThird(@Qualifier("fountExchange") FanoutExchange exchange,
                             @Qualifier("thirdQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange);
    }

    @Bean
    public Binding bingFourth(@Qualifier("fountExchange") FanoutExchange exchange,
                             @Qualifier("fourthQueue") Queue queue){
        return BindingBuilder.bind(queue).to(exchange);
    }

    /**
     * 创建监听
     * @param connectionFactory  如果不创建监听,此处默认RabbitMQ的localhost
     * @return
     */
    @Bean("rabbitListenerContainerFactory")
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(new Jackson2JsonMessageConverter());
        factory.setAcknowledgeMode(AcknowledgeMode.NONE);
        factory.setAutoStartup(true);
        return factory;
    }
}

***************************************************************************************************************************

@Component
@RabbitListener(queues = "FIRST_QUEUE", containerFactory="rabbitListenerContainerFactory")
public class FirstConsumer {

    @RabbitHandler
    public void process(@Payload String msg){
        System.out.println("First Queue received msg : " + msg);
    }

}

***************************************************************************************************************************

@Component
@RabbitListener(queues = "FOURTH_QUEUE", containerFactory="rabbitListenerContainerFactory")
public class FourthConsumer {

    @RabbitHandler
    public void process(@Payload String msg){
        System.out.println("Fourth Queue received msg : " + msg);
    }

}

***************************************************************************************************************************

@Component
@RabbitListener(queues = "SECOND_QUEUE", containerFactory="rabbitListenerContainerFactory")
public class SecondConsumer {

    @RabbitHandler
    public void process(@Payload String msg){
        System.out.println("Second Queue received msg : " + msg);
    }

}

***************************************************************************************************************************

@Component
@RabbitListener(queues = "THIRD_QUEUE", containerFactory="rabbitListenerContainerFactory")
public class ThirdConsumer {

    @RabbitHandler
    public void process(@Payload String msg){
        System.out.println("Third Queue received msg : " + msg);
    }

}

***************************************************************************************************************************

Consumer启动后,管理页面:自动创建对应的Exchange和Queue,以及对应的Binging

Producer

***************************************************************************************************************************

@Configuration
public class RabbitConfig {
    /**
     * 所有的消息发送都会转换成JSON格式发到交换机
     * @param connectionFactory
     * @return
     */
    @Bean
    public RabbitTemplate ginnyTemplate(final ConnectionFactory connectionFactory) {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        return rabbitTemplate;
    }
}

***************************************************************************************************************************

@Component
public class RabbitSender {
    @Autowired
    RabbitTemplate ginnyTemplate;

    public void send() {
        ginnyTemplate.convertAndSend("DIRECT_EXCHANGE","ginny.test", "a direct msg : 中原镖局,汉中省解放路266号");
        ginnyTemplate.convertAndSend("TOPIC_EXCHANGE","shanghai.ginny.test","a topic msg : shanghai.ginny.test");
        ginnyTemplate.convertAndSend("TOPIC_EXCHANGE","changsha.ginny.test","a topic msg : changsha.ginny.test");
        // 发送JSON字符串
        //ObjectMapper mapper = new ObjectMapper();
        String json = "a fanoutExchange msg : this message is from fanout";
        ginnyTemplate.convertAndSend("FOUNT_EXCHANGE","", json);
    }

}

***************************************************************************************************************************

Producer和Consumer启动后,Producer发送消息,运行结果如下:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值