SpringBoot3的RabbitMQ消息服务

目录

预备工作和配置

1.发送消息

实现类

控制层

效果

2.收消息

3.异步读取

效果

4.Work queues --工作队列模式

创建队列text2

实体类

效果

5.Subscribe--发布订阅模式

效果

6.Routing--路由模式

效果

7.Topics--通配符模式

效果


异步处理、应用解耦、流量削锋、分布式事务管理等,使用消息服务可以实现一个高性能、高可用、高扩展的系统。

为了高效处理消息,使用第三种方式,在写入消息队列后就响应,存在队列中。

预备工作和配置

打开RabbitMQ和控制页面并登录

新建一个消息队列

创建项目加入依赖并且写好配置类

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
# 配置RabbitMQ消息中间件连接配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

1.发送消息

实现类

调用RabbitTemplate类的convertAndSend方法,设置消息内容和消息队列。

@Service
public class DemoService {
    @Autowired
    RabbitTemplate rabbitTemplate;

    public void setRabbitTemplate() {
        //convertAndSend("RabbitMQ虚拟主机路径","消息队列","消息内容")
        rabbitTemplate.convertAndSend("", "text", "abc123456");
    }
 }

控制层

@RestController
public class MyCoutrollor {
    @Autowired
    DemoService demoService;

    @RequestMapping("/text")
    public String setDemoService() {
        demoService.setRabbitTemplate();
        return "setRabbitTemplate";
    }

效果

有一条消息,未取出,存在队列中

可见其中的值就是所存的值

2.收消息

监听器进行监听,不需要进行调用等,一旦发现该队列,将直接收取。

//监听器 workQueue1队列名 如果队列中有消息 就取走
    //@RabbitListener(queues = "text") 接收消息,queues="队列名"
    @RabbitListener(queues = "text")
    //默认参数Message
    public void revcMessage(Message message) {
        byte[] body = message.getBody();
        String result = new String(body);
        System.out.println(result);
    }

此时消息已被取走,队列中无消息。

3.异步读取

效果

此时并未取到值,只是存入队列后就立刻返回发送成功

4.Work queues --工作队列模式

指定唯一的消息队列进行消息传递。在这种模式下,多个消息消费者通过轮询的方式依次接收消息队列中存储的消息,一旦消息被某一个消费者接收,消息队列会将消息移除。

 @RabbitListener(queues = "text"),指定队列监听。

创建队列text2

实体类

@Data
public class User {
    public String name;
    public String password;
}

效果

//消息内容为对象
    public void setRabbitTemplate2() {
        User user = new User();
        user.setName("123");
        user.setPassword("123456");
        rabbitTemplate.convertAndSend("", "text", user);
    }

存进指定text2队列中

指定从text2中取出

//所有消息接受时,不管传输的是什么,接受时都转成字节
    @RabbitListener(queues = "text")
    //默认参数Message
    public void revcMessage2(User user) {
        System.out.println(user);
    }

此时队列中无消息

5.Subscribe--发布订阅模式

配置一个fanout类型的交换器,不需要指定对应的路由键(Routing key),同时会将消息路由到每一个消息队列上,然后每个消息队列都可以对相同的消息进行接收存储,在同一交换器下的所有队列都将收到消息。

@RabbitListener注解--创建队列和交换机并绑定,并且设置交换机类型。

效果

存入交换机中,此时不需要指定对应的键

  //广播模式
    public void setRabbitTemplate3() {
        User user = new User();
        user.setName("张三");
        user.setPassword("zhangsan123456");
        rabbitTemplate.convertAndSend("TextExchange", "", user);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text3"),//队列名
            exchange = @Exchange(
                    value = "TextExchange",//交换机名
                    type = "fanout")))//交换机类型  fanout----广播模式
    public void revcMessage3(User user) {
        System.out.println("fanout  TextExchange text3"+user);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text4"),//队列名
            exchange = @Exchange(
                    value = "TextExchange",//交换机名
                    type = "fanout")))//交换机类型  fanout----广播模式
    public void revcMessage4(User user) {
        System.out.println("fanout  TextExchange text4"+user);
    }

自动创建队列text3和text4

并且绑定了交换机

因为交换机类型为fanout----广播模式,所以该交换机绑定的所有队列均可收到消息。

6.Routing--路由模式

配置一个direct类型的交换器,并指定不同的路由键值(Routing key)将对应的消息从交换器路由到不同的消息队列进行存储,适用于进行不同类型消息分类处理的场合。

效果

指定了能取出消息的队列,所以应只有key = "info"的text5能取出消息。

//路由模式
    public void setRabbitTemplate4() {
        User user = new User();
        user.setName("123");
        user.setPassword("123456");
        rabbitTemplate.convertAndSend("Text4Exchange", "info", user);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text5"),//队列名
            exchange = @Exchange(
                    value = "Text4Exchange",//交换机名
                    type = "direct"),key = "info"))//交换机类型  direct----路由模式
    public void revcMessage5(User user) {
        System.out.println("fanout  Text4Exchange text5  "+user);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text6"),//队列名
            exchange = @Exchange(
                    value = "Text4Exchange",//交换机名
                    type = "direct"),key = "error"))//交换机类型  direct----路由模式
    public void revcMessage6(User user) {
        System.out.println("fanout  Text4Exchange text6  "+user);
    }

7.Topics--通配符模式

配置一个topic类型的交换器。与Routing模式不同的是:Routing只能指定一个key值,而通配符可以指定一类key值,只要含有指定词的那一类队列都可以收到,加强版路由模式。

效果

指定了一类key值的消息能被取出,所以应只有首位是info并且其中含有email的消息能被取出

//通配符模式
    public void setRabbitTemplate5() {
        User user = new User();
        user.setName("小红");
        user.setPassword("xiaohong123456");
        rabbitTemplate.convertAndSend("Text5Exchange", "info.email", user);
        User user1 = new User();
        user1.setName("小绿");
        user1.setPassword("xiaolv123456");
        rabbitTemplate.convertAndSend("Text5Exchange", "info.sms", user1);
        User user2 = new User();
        user2.setName("小蓝");
        user2.setPassword("xiaolan123456");
        rabbitTemplate.convertAndSend("Text5Exchange", "info.email.sms", user2);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text7"),//队列名
            exchange = @Exchange(
                    value = "Text5Exchange",//交换机名
                    type = "topic"),key = "info.#.email.#"))//交换机类型  topic----通配符模式
    public void revcMessage7(User user) {
        System.out.println("topic  Text5Exchange text7  "+user);
    }

取出满足条件的消息

  • 31
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在 Spring Boot 中发送 RabbitMQ 消息,你可以按照以下步骤进行操作: 1. 添加 RabbitMQ 依赖: 在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置 RabbitMQ 连接信息: 在 `application.properties` 或 `application.yml` 文件中配置 RabbitMQ 的连接信息,例如: ```properties spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3. 创建消息发送者: 创建一个消息发送者类,可以使用 `RabbitTemplate` 来发送消息。例如: ```java import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MessageSender { private final RabbitTemplate rabbitTemplate; private final Queue queue; @Autowired public MessageSender(RabbitTemplate rabbitTemplate, Queue queue) { this.rabbitTemplate = rabbitTemplate; this.queue = queue; } public void sendMessage(String message) { rabbitTemplate.convertAndSend(queue.getName(), message); System.out.println("Message sent: " + message); } } ``` 4. 定义队列: 在配置类中定义一个队列,例如: ```java import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean public Queue queue() { return new Queue("myQueue"); } } ``` 5. 发送消息: 在需要发送消息的地方,注入 `MessageSender` 并调用 `sendMessage` 方法发送消息。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application implements CommandLineRunner { @Autowired private MessageSender messageSender; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) { messageSender.sendMessage("Hello RabbitMQ!"); } } ``` 以上是一个简单的示例,你可以根据自己的需求进行扩展和修改。记得在消费者端配置相应的队列和监听器来接收消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随便1007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值