学习StringBoot整合RabbitMQ

前提:需要下载Erlang OTP和RabbitMQ.(需要版本兼容)

Erlang OTP下载

链接:https://pan.baidu.com/s/14V0o5eY3dCYW67T_O39EVQ 
提取码:i9pl

RabbitMQ下载

链接:https://pan.baidu.com/s/1vsH4tloTYuiGvN0j7iUddw 
提取码:6xyr

怎么安装可以百度.

创建好一个maven项目,导入需要的依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <version>2.0.1.RELEASE</version>
        <artifactId>spring-boot-starter-parent</artifactId>
    </parent>

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

配置文件

spring:
  rabbitmq:
    host: localhost
    username: guest
    password: guest
    virtual-host: /
    port: 5672

rabbitMQ配置类

package com.mq.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类
 */
@EnableRabbit//声明开启
@Configuration
public class RabbitMQConfig {

    //队列名称
    public static final String QUEUE_NAME="boot-queue";

    //队列名称
    public static final String QUEUE_QUEUE="queue_queue";
    
    //交换机
    public static final String EXCHANGE_NAME="boot_exchange";


    @Bean("queueQueue")
    public Queue queueQueue(){
        return QueueBuilder.durable(QUEUE_QUEUE).build();
    }
    
    @Bean("bootExchange")
    public Exchange bootExchange(){
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }

    @Bean("bootQueue")
    public Queue bootQueue(){
        return QueueBuilder.durable(QUEUE_NAME).build();
    }


     /**
     * 连接交换机和队列
     * @param queue
     * @param exchange
     * @return
     */
    @Bean
    public Binding bindQueueExchange(@Qualifier("bootQueue")Queue queue,@Qualifier("bootExchange")Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("boot.#").noargs();
    }
    
    
}

消费者类

package com.mq.rabbitmq.listener;

import com.mq.rabbitmq.config.RabbitMQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Service;

/**
 * 监听消费者
 */
@Slf4j
@Service
public class QueueConsumer {

    /**
     * fileBody:承载的是消息体
     * @RabbitListener 监听消费者
     * queue 队列名
     * @param fileBody
     */
    @RabbitListener(queues = {"ss007"})
    public void receive(@Payload String fileBody){
        log.info("ss007队列:"+fileBody);
    }
}

生产者类

package com.mq.rabbitmq.controller;


import com.mq.rabbitmq.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
public class SimpleProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @RequestMapping("/ceshi")
    public String ceshi( String messageId){
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(new Date());
        //ss007是队列的名称,format发送的消息
        rabbitTemplate.convertAndSend("ss007",format);
        System.out.println("rabbitMQ 简单模式消息发送成功!");
        return "true";
    }

}

结果是:

 

同一个生产者可以多种消息类型,消费者可以根据传递消息的类型直行不同的方法;

@RabbitListener既可以放在方法上有可以放在类上,放在类上的时候需要
@RabbitHandler放在方法上配合使用.

消费者类

package com.mq.rabbitmq.listener;


import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Map;


/**
 * 简单模式
 * 消息消费者
 */
@Component
@Slf4j
@RabbitListener(queues = "my_queue")//监听的队列名称
public class SimpleConsumer {

    //消费者如果监听到消息队列有消息传入,则会自动消费
    @RabbitHandler
    public void receive(Map message) {
        System.out.println("简单模式 -> 消费者收到map类型消息  : " + message.toString());
    }

    //@RabbitListener(queues = "my_queue")//监听的队列名称
    @RabbitHandler
    public void receive2(String message) {
        System.out.println("简单模式 -> 消费者收到string类型消息  : " + message.toString());
    }

}

生产者类

package com.mq.rabbitmq.controller;


import com.mq.rabbitmq.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
public class SimpleProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @RequestMapping("/send")
    public String send(String messageId, String messageData) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(new Date());
        messageId = "1";
        messageData = "2";
        Map<String, Object> map = new HashMap<>();
        map.put("messageId", messageId);
        map.put("messageData", messageData);
        map.put("createTime", format);
        rabbitTemplate.convertAndSend("my_queue", map);
        System.out.println("rabbitMQ 简单模式消息发送成功!");
        return "true";
    }

    @RequestMapping("/send1")
    public String send1(String messageId) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(new Date());
        rabbitTemplate.convertAndSend("my_queue", format);
        System.out.println("rabbitMQ 简单模式消息发送成功!");
        return "true";
    }
}

两个方法执行的结果:

 使用exchange的fanout类型,fanout表示向所有的队列都发送该消息.

RabbitMQ配置类

package com.mq.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类
 */
@EnableRabbit//声明开启
@Configuration
public class RabbitMQConfig {

    public static final String QUEUE_QUEUE="queue_queue";

    public static final String QUEUE_QUEUE1="queue_queue1";

    public static final String QUEUE_QUEUE2="queue_queue2";

    public static final String EXCHANGE_QUEUE="queue_exchange";

    @Bean("queueQueue")
    public Queue queueQueue(){
        return QueueBuilder.durable(QUEUE_QUEUE).build();
    }

    @Bean("queueQueue1")
    public Queue queueQueue1(){
        return QueueBuilder.durable(QUEUE_QUEUE1).build();
    }

    @Bean("queueQueue2")
    public Queue queueQueue2(){
        return QueueBuilder.durable(QUEUE_QUEUE2).build();
    }
    
    //设置交换机:fanout
    @Bean("queueExchange")
    public Exchange queueExchange(){
        return ExchangeBuilder.fanoutExchange(EXCHANGE_QUEUE).durable(true).build();
    }

    @Bean
    public Binding bindingQueueExchange(@Qualifier("queueQueue")Queue queue,@Qualifier("queueExchange")FanoutExchange exchange){
        return BindingBuilder.bind(queue).to(exchange);
    }

    @Bean
    public Binding fanoutQueueExchange(@Qualifier("queueQueue1")Queue queue,@Qualifier("queueExchange")FanoutExchange exchange){
        return BindingBuilder.bind(queue).to(exchange);
    }

    @Bean
    public Binding fanoutTwoQueueExchange(@Qualifier("queueQueue2")Queue queue,@Qualifier("queueExchange")FanoutExchange exchange){
        return BindingBuilder.bind(queue).to(exchange);
    }
}

 消费者类

package com.mq.rabbitmq.listener;

import com.mq.rabbitmq.config.RabbitMQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Service;

/**
 * 监听消费者
 */
@Slf4j
@Service
public class QueueConsumer {


    @RabbitListener(queues = RabbitMQConfig.QUEUE_QUEUE)
    public void queue(@Payload String fileBody){
        log.info(RabbitMQConfig.QUEUE_QUEUE+"测试成功");
        System.out.println("第0个"+fileBody);
    }

    @RabbitListener(queues = RabbitMQConfig.QUEUE_QUEUE1)
    public void queue1(@Payload String fileBody){
        log.info(RabbitMQConfig.QUEUE_QUEUE1+"测试成功1");
        System.out.println("第1个"+fileBody);
    }

    @RabbitListener(queues = RabbitMQConfig.QUEUE_QUEUE2)
    public void queue2(@Payload String fileBody){
        log.info(RabbitMQConfig.QUEUE_QUEUE2+"测试成功2");
        System.out.println("第2个"+fileBody);
    }


}

生产者类

package com.mq.rabbitmq.controller;


import com.mq.rabbitmq.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
public class SimpleProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @RequestMapping("/queue")
    public String queue(String messageId) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(new Date());
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_QUEUE, format, "分发给每个绑定的队列.");
        System.out.println("exchange的fanout类型分发给所有的队列,消息发送成功!");
        return "true";
    }
}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值