RabbitMQ(三)rabbitMQ的使用

1、创建springboot项目

项目名springboot-rabbitmq
GitHub地址:
https://github.com/ZiCheng-Web/springboot-rabbitmq
[email protected]:ZiCheng-Web/springboot-rabbitmq.git

添加 pom 依赖

<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>

修改 application.yml 配置

spring:
  rabbitmq:
    host: 192.168.202.128
    port: 5672
    username: rabbit
    password: 123456

一、发布/订阅模式(Publish/Subscribe)

1、创建实体类User

@Data
public class User {
    private Integer id;
    private String username;
}

2、测试类

@SpringBootTest
class SpringbootRabbitmqApplicationTests {
    //  AmqpAdmin:RabbitMQ系统管理功能组件(可以创建exchange,queue,Binding)
    @Autowired
    private AmqpAdmin amqpAdmin;

    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * 使用AmqpAdmin管理员API定制消息组件
     */
    @Test
    public void amqpAdmin() {
        // 1、定义fanout类型的交换器,名为fanout_exchange
        // fanout,广播式交换器
        amqpAdmin.declareExchange(new FanoutExchange("fanout_exchange"));
        // 2、定义两个默认持久化队列,分别处理email和sms
        amqpAdmin.declareQueue(new Queue("fanout_queue_email"));
        amqpAdmin.declareQueue(new Queue("fanout_queue_sms"));
        // 3、将队列分别与交换器进行绑定
        amqpAdmin.declareBinding(new Binding("fanout_queue_email", Binding.DestinationType.QUEUE,"fanout_exchange","",null));
        amqpAdmin.declareBinding(new Binding("fanout_queue_sms",Binding.DestinationType.QUEUE,"fanout_exchange","",null));
    }
}

3、配置转换消息转换器,json格式,因为User是Object类,并不是String之类的。创建配置类

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;

@Configuration
public class RabbitMQConfig {
    /**
     * 定制JSON格式的消息转换器
     * @return
     */
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

4、消息服务提供者已经将消息提供给了转换器,http://ip:15672/#/queues
在这里插入图片描述
5、创建消息服务的消费者

@Service
public class RabbitMQService {
    /**
     * Publish/Subscribe工作模式接收,处理邮件业务
     *
     * @param message
     */
    @RabbitListener(queues = "fanout_queue_email")
    public void psubConsumerEmail(Message message) {
        byte[] body = message.getBody();
        String s = new String(body);
        System.out.println("邮件业务接收到消息: " + s);

    }

    /**
     * Publish/Subscribe工作模式接收,处理短信业务
     *
     * @param message
     */
    @RabbitListener(queues = "fanout_queue_sms")
    public void psubConsumerSms(Message message) {
        byte[] body = message.getBody();
        String s = new String(body);
        System.out.println("短信业务接收到消息: " + s);
    }
}

6、启动项目
在这里插入图片描述
7、基于配置类的方式定制消息发送组件,并进行消息发送。

@Configuration
public class RabbitMQConfig {
    /**
     * 定制JSON格式的消息转换器
     * @return
     */
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 使用基于配置类的方式定制消息中间件
     * @return
     */
    // 1、定义fanout类型的交换器
    @Bean
    public Exchange fanout_exchange(){
        return ExchangeBuilder.fanoutExchange("fanout_exchange").build();
    }
    // 2、定义两个不同名称的消息队列
    @Bean
    public Queue fanout_queue_email(){
        return new Queue("fanout_queue_email");
    }
    @Bean
    public Queue fanout_queue_sms(){
        return new Queue("fanout_queue_sms");
    }
    // 3、将两个不同名称的消息队列与交换器进行绑定
    @Bean
    public Binding bindingEmail(){
        return BindingBuilder.bind(fanout_queue_email()).to(fanout_exchange()).with("").noargs();
    }
    @Bean
    public Binding bindingSms(){
        return BindingBuilder.bind(fanout_queue_sms()).to(fanout_exchange()).with("").noargs();
    }

}

8、重构消息服务的消费者

@Service
public class RabbitMQService {
	/**
     *  **使用基于注解的方式实现消息服务
     * 1.1、Publish/Subscribe工作模式接收,处理邮件业务
     * @param user
     */
    @RabbitListener(bindings =@QueueBinding(value =@Queue("fanout_queue_email"), exchange =@Exchange(value = "fanout_exchange",type = "fanout")))
    public void psubConsumerEmailAno(User user) {
        System.out.println("邮件业务接收到消息: "+user);
    }
    /**
     * 1.2、Publish/Subscribe工作模式接收,处理短信业务
     * @param user
     */
    @RabbitListener(bindings =@QueueBinding(value =@Queue("fanout_queue_sms"),exchange =@Exchange(value = "fanout_exchange",type = "fanout")))
    public void psubConsumerSmsAno(User user) {
        System.out.println("短信业务接收到消息: "+user);
    }
 }

再次启动项目,结果一致

二、Routing路由工作模式

1、使用注解的方式定制消息传送组件和消息消费者

/**
     *  2.1、路由模式消息接收,处理error级别日志信息
     * @param message
     */
    @RabbitListener(bindings =@QueueBinding(value =@Queue("routing_queue_error"),exchange =@Exchange(value = "routing_exchange",type = "direct"),key = "error_routing_key"))
    public void routingConsumerError(String message) {
        System.out.println("接收到error级别日志消息: "+message);
    }
    /**
     *  2.2、路由模式消息接收,处理info、error、warning级别日志信息
     * @param message
     */
    @RabbitListener(bindings =@QueueBinding(value =@Queue("routing_queue_all"),exchange =@Exchange(value = "routing_exchange",type = "direct"),key = {"error_routing_key","info_routing_key","warning_routing_key"}))
    public void routingConsumerAll(String message) {
        System.out.println("接收到info、error、warning等级别日志消息: "+message);
    }

消息提供者

 /**
     *	2、Routing工作模式消息发送端
     */
    @Test
    public void routingPublisher() {
        rabbitTemplate.convertAndSend("routing_exchange","error_routing_key","routing send  error message");
    }

在这里插入图片描述
在这里插入图片描述

三、Topics通配符工作模式

/**
     *  3.1、通配符模式消息接收,进行邮件业务订阅处理
     * @param message
     *
     * info.#.email.# :可以匹配到以info开头,又包括email的key的所有队列
     */
    @RabbitListener(bindings =@QueueBinding(value =@Queue("topic_queue_email"),exchange =@Exchange(value = "topic_exchange",type = "topic"),key = "info.#.email.#"))
    public void topicConsumerEmail(String message) {
        System.out.println("接收到邮件订阅需求处理消息: "+message);
    }
    /**
     *  3.2、通配符模式消息接收,进行短信业务订阅处理
     * @param message
     *
     * info.#.sms.# :可以匹配到以info开头,又包括sms的key的所有队列
     */
    @RabbitListener(bindings =@QueueBinding(value =@Queue("topic_queue_sms"),exchange =@Exchange(value = "topic_exchange",type = "topic"),key = "info.#.sms.#"))
    public void topicConsumerSms(String message) {
        System.out.println("接收到短信订阅需求处理消息: "+message);
    }
 /**
     *	3、Topcis工作模式消息发送端
     */
    @Test
    public void topicPublisher() {
        // 1、只发送邮件订阅用户消息
//        rabbitTemplate.convertAndSend("topic_exchange","info.email","topics send  email message");
        // 2、只发送短信订阅用户消息
//	    rabbitTemplate.convertAndSend("topic_exchange","info.sms","topics send  sms message");
        // 3、发送同时订阅邮件和短信的用户消息
        rabbitTemplate.convertAndSend("topic_exchange","info.email.sms","topics send  email and sms message");
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了44 篇原创文章 · 获赞 5 · 访问量 915

猜你喜欢

转载自blog.csdn.net/qq_40634246/article/details/104576179