Spring Boot集合RabbitMQ

RabbitMQ在SpringBoot中的使用

Spring官网中如何在Spring中配置RabbitMQ:AMQP :: Spring Boot

在创建项目的时候导入其依赖

添加配置项

工作队列中消息的发送

创建一个队列

@Configuration
public class RabbitMQConfig {

//    当spring启动的时候,自动创建,并且注册一个RabbitMQ队列

    @Bean("workQueue")
    public Queue workQueue(){
        return QueueBuilder.durable(Constants.WORK_QUEUE123).build();
    }
}

将队列名称定义为一个常量

    public static final String WORK_QUEUE123="work.queue";

进行消息的发送

@RestController
@RequestMapping("/rabbit")
public class ProducerController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @RequestMapping("/work")
    public String work() {

        for (int i = 0; i < 10; i++) {
            System.out.println("消息发送成功");
            rabbitTemplate.convertAndSend("", Constants.WORK_QUEUE123, "hello rabbitMQ Spring Boot");
        }
        return "消息发送成功";
    }
}

消息的接收

@Component
public class WorkListener {


    @RabbitListener(queues = Constants.WORK_QUEUE123)
    public void queueListener1(Message message ,Channel channel){
        System.out.println("监听的队列"+Constants.WORK_QUEUE123+"收到的消息"+message+"channel"+channel);
    }

    @RabbitListener(queues = Constants.WORK_QUEUE123)
    public void queueListener2(String message){
        System.out.println("监听的队列"+Constants.WORK_QUEUE123+"收到的消息"+message);
    }


}

发布订阅模式(Publish/Subscribe)

在发布订阅模式中多了一个新的角色 Exchange(交换机)

创建两个队列,一个交换机,在创建队列的时候,将队列定义为持久化

    @Bean("fanoutQueue1")
    public Queue fanoutQueue1(){
        return QueueBuilder.durable(Constants.FANOUT_QUEUE1).build();
    }

    @Bean("fanoutQueue2")
    public Queue fanoutQueue2(){
        return QueueBuilder.durable(Constants.FANOUT_QUEUE2).build();
    }

    @Bean("fanoutExchange")
    public FanoutExchange fanoutExchange(){
        return ExchangeBuilder.fanoutExchange(Constants.FANOUT_EXCHANGE).durable(true).build();
    }

将队列和交换机进行绑定

@Bean("fanoutBinding1")
    public Binding fanoutBinding1(@Qualifier("fanoutExchange") FanoutExchange exchange,@Qualifier("fanoutQueue1") Queue queue){
        return BindingBuilder.bind(queue).to(exchange);
    }

    @Bean("fanoutBinding2")
    public Binding fanoutBinding2(@Qualifier("fanoutExchange") FanoutExchange exchange,@Qualifier("fanoutQueue2") Queue queue){
        return BindingBuilder.bind(queue).to(exchange);
    }

将其名字定义为常量

    public static final String FANOUT_QUEUE1="fanout.queue1";
    public static final String FANOUT_QUEUE2="fanout.queue2";
    public static final String FANOUT_EXCHANGE="fanout.exchange";

发送消息

@RequestMapping("/fanout")
    public String fanout() {
        for (int i = 0; i < 10; i++) {
            System.out.println("消息发送成功");
            rabbitTemplate.convertAndSend(Constants.FANOUT_EXCHANGE, "", "hello spring amqp:fanout...");
        }
        return "发送成功";

    }

接收消息

@Component
public class FanoutListener {

    @RabbitListener(queues = Constants.FANOUT_QUEUE1)
    public void fanoutQueueListener1(String message){
        System.out.println("监听的队列"+Constants.FANOUT_QUEUE1+"收到的消息"+message);
    }

    @RabbitListener(queues = Constants.FANOUT_QUEUE2)
    public void fanoutQueueListener2(String message){
        System.out.println("监听的队列"+Constants.FANOUT_QUEUE2+"收到的消息"+message);
    }
}

路由模式(Routing)

定义队列和交换机

@Bean("directQueue1")
    public Queue directQueue1(){
        return QueueBuilder.durable(Constants.DIRECT_QUEUE1).build();
    }
    @Bean("directQueue2")
    public Queue directQueue2(){
        return QueueBuilder.durable(Constants.DIRECT_QUEUE2).build();
    }
    @Bean("directExchange")
    public DirectExchange directExchange(){
        return ExchangeBuilder.directExchange(Constants.DIRECT_EXCHANGE).durable(true).build();
    }

定义队列和交换机的名字为常量

    public static final String DIRECT_QUEUE1="direct.queue1";
    public static final String DIRECT_QUEUE2="direct.queue2";
    public static final String DIRECT_EXCHANGE="direct.exchange";

将队列和交换机进行绑定,并且定义rountingKey

    @Bean("directBlinding1")
    public Binding directBlinding1(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue1") Queue queue){
        return BindingBuilder.bind(queue).to(directExchange).with("orange");
    }

    @Bean("directBlinding2")
    public Binding directBlinding2(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue){
        return BindingBuilder.bind(queue).to(directExchange).with("black");
    }

    @Bean("directBlinding3")
    public Binding directBlinding3(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue){
        return BindingBuilder.bind(queue).to(directExchange).with("orange");
    }

发送消息

@RequestMapping("/directByOrange")
    public String directByOrange() {
        for (int i = 0; i < 4; i++) {
            System.out.println("消息发送成功");
            rabbitTemplate.convertAndSend(Constants.DIRECT_EXCHANGE, "orange", "<orange>hello spring amqp:direct...");
        }
        return "发送成功";

    }

    @RequestMapping("/directByBlack")
    public String directByBlack() {
        for (int i = 0; i < 4; i++) {
            System.out.println("消息发送成功");
            rabbitTemplate.convertAndSend(Constants.DIRECT_EXCHANGE, "black", "<black>hello spring amqp:direct...");
        }
        return "发送成功";
    }

接收消息

@Component
public class DirectListener {
    @RabbitListener(queues = Constants.DIRECT_QUEUE1)
    public void directQueueListener1(String message){
        System.out.println("监听的队列"+Constants.DIRECT_QUEUE1+"收到的消息"+message);
    }

    @RabbitListener(queues = Constants.DIRECT_QUEUE2)
    public void directQueueListener2(String message){
        System.out.println("监听的队列"+Constants.DIRECT_QUEUE2+"收到的消息"+message);
    }
}

通过rountingKey:orange发送消息

通过rountingKey:black发送消息

通配符模式(Topics)

创建队列和交换机

@Bean("topicQueue1")
    public Queue topicQueue1(){
        return QueueBuilder.durable(Constants.TOPIC_QUEUE1).build();
    }
    @Bean("topicQueue2")
    public Queue topicQueue2(){
        return QueueBuilder.durable(Constants.TOPIC_QUEUE2).build();
    }

    @Bean("topicExchange")
    public TopicExchange topicExchange(){
        return ExchangeBuilder.topicExchange(Constants.TOPIC_EXCHANGE).durable(true).build();
    }

定义队列和交换机的名字为常量

    public static final String TOPIC_QUEUE1="topic.queue1";
    public static final String TOPIC_QUEUE2="topic.queue2";
    public static final String TOPIC_EXCHANGE="topic.exchange";

将队列和交换机进行绑定

定义rountingKey的通配符规则

@Bean("topicBlinding1")
    public Binding topicBlinding1(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue1") Queue queue){
        return BindingBuilder.bind(queue).to(topicExchange).with("*.*.mm");
    }
    @Bean("topicBlinding2")
    public Binding topicBlinding2(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue2") Queue queue){
        return BindingBuilder.bind(queue).to(topicExchange).with("*.nn.*");
    }
    @Bean("topicBlinding3")
    public Binding topicBlinding3(@Qualifier("topicExchange") TopicExchange topicExchange,@Qualifier("topicQueue2") Queue queue){
        return BindingBuilder.bind(queue).to(topicExchange).with("pp.#");
    }

发送消息

进行路径的匹配

@RequestMapping("/topic/{routingKey}")
    public String topic(@PathVariable("routingKey") String routingKey){
        System.out.println("消息发送成功");
        rabbitTemplate.convertAndSend(Constants.TOPIC_EXCHANGE, routingKey, "hello spring amqp:topic, my routing key is "+routingKey);
        return "发送成功";
    }

接受消息

@Component
public class TopicListener {
    @RabbitListener(queues = Constants.TOPIC_QUEUE1)
    public void topicQueueListener1(String message){
        System.out.println("监听的队列"+Constants.TOPIC_QUEUE1+"收到的消息"+message);
    }

    @RabbitListener(queues = Constants.TOPIC_QUEUE2)
    public void topicQueueListener2(String message){
        System.out.println("监听的队列"+Constants.TOPIC_QUEUE2+"收到的消息"+message);
    }
}

由此可见,发送的消息已经全部被消费

基于SpringBoot+RabbitMQ完成通信

实订单项目和物流项目之间的通信

在创建好项目之后,在项目中配置好RabbitMQ的信息

首先进行队列的申明

@Configuration
public class RabbitConfig {

    @Bean("workQueue")
    public Queue workQueue(){
        return QueueBuilder.durable("queue.build").build();
    }

在订单系统下单成功后,进行订单消息的发送

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @RequestMapping("/createOrder")
    public String createOrder(){
        String orderId= UUID.randomUUID().toString();
        rabbitTemplate.convertAndSend("","queue.build","下单成功"+orderId);
        return "下单成功";
    }

在物流系统中进行消息的接收


@Component
public class OrderListener {

    @RabbitListener(queues = "queue.build")
    public void listenerQueue(String message){
        System.out.println("接收到的消息"+message);
    }

    @RabbitHandler
    @RabbitListener(queues = "queue.build")
    public void ListenerQueue(UserInfo userinfo){
        System.out.println("接收到的消息"+userinfo);
    }
}

消息已经被消费

发送消息格式为对象

创建一个对象

@Data
public class UserInfo {
    private String messageId;

    private String messageName;
}

使用Json转换器,并将Json转换器绑定到自定义的RabbitTemplate,进行JSON 序列化,跨语言、可读、安全

//    定义一个Json消息转换器

    @Bean
    public Jackson2JsonMessageConverter jackson2JsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Jackson2JsonMessageConverter jackson2JsonMessageConverter){
        RabbitTemplate rabbitTemplate=new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter());
        return rabbitTemplate;
    }

进行对象消息的发送

@RequestMapping("/createOrder1")
    public String createOrder1(){
        String orderId= UUID.randomUUID().toString();
        UserInfo userInfo=new UserInfo();
        userInfo.setMessageId(orderId);
        userInfo.setMessageId("发送消息成功");
        rabbitTemplate.convertAndSend("","queue.build",userInfo);
        return "下单成功";
    }

先在物流系统中配置JSON 消息转换器

@Configuration
public class RabbitConfig {
    @Bean
    public Jackson2JsonMessageConverter converter() {
        return new Jackson2JsonMessageConverter();
    }

进行消息的接收

    @RabbitHandler
    @RabbitListener(queues = "queue.build")
    public void ListenerQueue(UserInfo userinfo){
        System.out.println("接收到的消息"+userinfo);
    }

分布式微服务企业级系统是一个基于SpringSpringMVC、MyBatis和Dubbo等技术的分布式敏捷开发系统架构。该系统采用微服务架构和模块化设计,提供整套公共微服务模块,包括集中权限管理(支持单点登录)、内容管理、支付中心、用户管理(支持第三方登录)、微信平台、存储系统、配置中心、日志分析、任务和通知等功能。系统支持服务治理、监控和追踪,确保高可用性和可扩展性,适用于中小型企业的J2EE企业级开发解决方案。 该系统使用Java作为主要编程语言,结合Spring框架实现依赖注入和事务管理,SpringMVC处理Web请求,MyBatis进行数据持久化操作,Dubbo实现分布式服务调用。架构模式包括微服务架构、分布式系统架构和模块化架构,设计模式应用了单例模式、工厂模式和观察者模式,以提高代码复用性和系统稳定性。 应用场景广泛,可用于企业信息化管理、电子商务平台、社交应用开发等领域,帮助开发者快速构建高效、安全的分布式系统。本资源包含完整的源码和详细论文,适合计算机科学或软件工程专业的毕业设计参考,提供实践案例和技术文档,助力学生和开发者深入理解微服务架构和分布式系统实现。 【版权说明】源码来源于网络,遵循原项目开源协议。付费内容为本人原创论文,包含技术分析和实现思路。仅供学习交流使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值