RabbitMQ与SpringBoot整合

前文总结了Dubbo与SpringBoot的整合(https://www.cnblogs.com/cott/p/12373043.html),本文基于这套框架,引入RabbitMQ消息队列。

1.在linux环境使用docker安装RabbitMQ

//拉取镜像docker pull rabbitmq:management
//启动镜像
docker run -di --name myrabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management

安装成功后登陆控制台

RabbitMQ与SpringBoot整合

2.生产者

pom.xml中引入RabbitMQ依赖

<dependency>
   <groupId>org.springframework.bootgroupId>
   <artifactId>spring-boot-starter-amqpartifactId>
  <version>1.3.5.RELEASEversion>
dependency>

application.yml

配置RabbitMQ服务端连接,和交换机名称

spring:
  rabbitmq:
    port: 5672
    username: admin
    password: admin
    host: 192.168.200.128
    virtual-host: /

order:
  fanout:
    exchange: order.fanout.exchange

Producer.java

生产者向MQ发送消息

package com.cott.gmail.bootuserserviceprovider.mq;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.UUID;

@Component
public class Producer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Value("${order.fanout.exchange}")
    private String exchangeName;

    public void sendMsg() {
        String orderId = UUID.randomUUID().toString();
        String message = "你的订单信息是:" + orderId + ",日期是:" + new Date();
        rabbitTemplate.convertAndSend(exchangeName, message);
    }
}

UserServiceImpl.java

在用户接口的实现类中,调用生产者的方法

package com.cott.gmail.bootuserserviceprovider.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.cott.gmail.bean.UserAddress;
import com.cott.gmail.bootuserserviceprovider.mq.Producer;
import com.cott.gmail.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Service
@Component
public class UserServiceImpl implements UserService {

    @Autowired
    Producer producer;

    @Override
    public List getAddress(String uesrId) {
        producer.sendMsg();
        UserAddress userAddress1 = new UserAddress();
        userAddress1.setId(1);
        userAddress1.setUserAddress("1");
        userAddress1.setUserId("1");
        UserAddress userAddress2 = new UserAddress();
        userAddress2.setId(2);
        userAddress2.setUserAddress("2");
        userAddress2.setUserId("2");

        return Arrays.asList(userAddress1, userAddress2);
    }
}

3.消费者

pom.xml中引入RabbitMQ依赖

<dependency>
   <groupId>org.springframework.bootgroupId>
   <artifactId>spring-boot-starter-amqpartifactId>
  <version>1.3.5.RELEASEversion>
dependency>

application.yml

配置RabbitMQ服务端信息,和交换机以及队列名称

spring:
  rabbitmq:
    port: 5672
    username: admin
    password: admin
    host: 192.168.200.128
    virtual-host: /

order:
  fanout:
    exchange: order.fanout.exchange
    queue: order.fanout.queue

Consumer.java

消费者

@RabbitListener注解,绑定队列,交换机,以及选择交换模式FANOUT

@RabbitListener 可以标注在类上面,需配合 @RabbitHandler 注解一起使用
@RabbitListener 标注在类上面表示当有收到消息的时候,就交给 @RabbitHandler 的方法处理,具体使用哪个方法处理,根据 MessageConverter 转换后的参数类型

package com.cott.gmail.bootorderserviceconsumer.service.impl;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "${order.fanout.queue}", autoDelete = "true"), exchange =
@Exchange(value = "${order.fanout.exchange}", type = ExchangeTypes.FANOUT)))
public class Consumer {

    @RabbitHandler
    public void processMessage(String msg) {
        System.out.format("Receiving Message: -----[%s]----- \n.", msg);
    }
}

OrderServiceImpl.java

消费者中有调用生产者getAddress()的方法,生产者向MQ中发送一条消息,同时消费者监听MQ,消费消息。

package com.cott.gmail.bootorderserviceconsumer.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.cott.gmail.bean.UserAddress;
import com.cott.gmail.service.OrderService;
import com.cott.gmail.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class OrderServiceImpl implements OrderService {

    @Reference
    UserService userService;

    @Override
    public List initOrder(String id) {
        System.out.println("id= " + id);
        List list = userService.getAddress("1");
        for (UserAddress user : list
        ) {
            System.out.println(user.getUserAddress());
        }
        return list;
    }
}

4.验证

先后启动生产者和消费者,在浏览器发起请求

RabbitMQ与SpringBoot整合

消费者控制台输出

RabbitMQ与SpringBoot整合

同时在RabbitMQ控制台查看监控日志

RabbitMQ与SpringBoot整合

Original: https://www.cnblogs.com/cott/p/12402423.html
Author: Cott
Title: RabbitMQ与SpringBoot整合

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590319/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringCloud — zuul

    什么是API网关 在微服务架构中,通常会有多个服务提供者。设想一个电商系统,可能会有商品、订单、支付、用户等多个类型的服务,而每个类型的服务数量也会随着整个系统体量的增大也会随之增…

    Java 2023年6月8日
    089
  • Log4j2详解——XML配置详解

    Log4j2详解——XML配置详解 找到了个很详细的文章链接 https://www.jianshu.com/p/bfc182ee33db Original: https://ww…

    Java 2023年6月7日
    070
  • The valid characters are defined in RFC 7230 and RFC 3986

    The valid characters are defined in RFC 7230 and RFC 3986 1.异常截图 2.原因说明 ​ 导致上述问题是因为tomcat自…

    Java 2023年6月8日
    096
  • Effective Java 第三版——77. 不要忽略异常

    Tips书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code注意,书中的有些代码里方法是基于Java 9…

    Java 2023年5月29日
    091
  • 数字化来势汹汹,低代码起势,JNPF助力企业定制专属BIM

    引言 当前的中国建筑市场极大,而建筑行业在迅速发展的同时也需要科学的可持续发展,所以施工企业面临着极其严峻的竞争挑战。在此背景下,国内企业运用BIM的比例持续升高是发展的必然。BI…

    Java 2023年6月5日
    092
  • vue3进阶学习

    vue3进阶学习 官方网站:https://v3.vuejs.org/中文文档: https://staging-cn.vuejs.org/guide/introduction.h…

    Java 2023年6月5日
    0100
  • 【Java线程】BlockingQueue的抵达容量上限自动阻塞效果展示

    【代码】 package com.hy.lab.blkq; import java.util.concurrent.ArrayBlockingQueue; import java….

    Java 2023年5月29日
    062
  • Java线程池中线程的状态简介

    首先明确一下线程在JVM中的各个状态(JavaCore文件中) 1.死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on…

    Java 2023年6月15日
    063
  • 从零开始自己动手写自旋锁

    我们在写并发程序的时候,一个非常常见的需求就是保证在某一个时刻只有一个线程执行某段代码,像这种代码叫做临界区,而通常保证一个时刻只有一个线程执行临界区的代码的方法就是锁🔒。在本篇文…

    Java 2023年6月8日
    077
  • [学习笔记] Java接口

    接口是Java中的一种抽象类型,是抽象方法的集合; 接口使用 interface关键字声明; 接口不是类,它们属于不同的概念,类描述对象的属性和方法,接口则包含要实现的方法; 一个…

    Java 2023年6月5日
    066
  • 使用SLF4J和LOGBACK (一 : 基本使用)

    上边两行代码中的Logger和LoggerFactory对象均来自SLF4J包中。 具体的日志实现框架,我们可以选择LOG4J,LOGBACK等作为日志的具体实现,但是日志的打印输…

    Java 2023年6月16日
    088
  • 计算字符串的相似度【转自编程之美】

    #include #include #include using namespace std; int minValue(int a,int b,int c) { int min=…

    Java 2023年6月7日
    081
  • JavaScript&Bootstrap

    JS介绍 JS诞生主要是完成页面的数据验证。因此它运行在客户端,需要浏览器来执行JS代码 JS最早取名LiveScript;为了吸引更多的Java程序员,更名JavaScript …

    Java 2023年6月6日
    062
  • Javaweb面试

    一:cookie和session的区别?1.session和cookie都是会话跟踪技术2.session是保存在服务器端的技术,而cookie是保存在客户端的技术3.cookie…

    Java 2023年6月5日
    083
  • 面试题:java线程的生命周期?线程的状态是如何转移的(马士兵讲解)

    线程的生命周期,状态是如何转移的 Thread类里有个枚举类: public enum State { //新建状态 NEW, //Runnable状态 RUNNABLE, //B…

    Java 2023年5月29日
    057
  • 方法(Java)

    什么是方法? 基本介绍 在其他语言中也叫函数 System.out.println();类名.对象.方法; Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步…

    Java 2023年6月9日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球