Spring Boot 整合 RabbitMq — 三种Exchange模式

前言

AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

RabbitMq与spring boot整合简单了解

引入springboot amqp包

<!-- amqp-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>

application.yml

spring:
  rabbitmq:
    username: admin
    password: 123456
    host: 192.168.56.128
    port: 5672
    listener:
      simple:
        concurrency: 5 #消费端最小并发数
        max-concurrency: 10 #消费端最大并发数
        prefetch: 5 #一次请求中预处理的消息数量
    cache:
      channel:
        size: 50 # 缓存的channel数量

 

一、发布订阅

 

/**
 * Create by Administrator on 2018/10/12
 * Exchange三种模式配置
 * @author admin
 */
@Configuration
public class RabbitMqExchangeConfig {

    
    /**
     * 广播交换器
     * @return
     */
    @Bean
    public FanoutExchange fanout(){
        return  new FanoutExchange("tut.fanout");
    }

    
    private static class FanoutConfig {

        //AnonymousQueue类型的队列,它的名字是由客户端生成的,而且是非持久的,独占的,自动删除的队列
        @Bean
        public Queue autoDeleteQueue1() {
            return new AnonymousQueue();
        }

        @Bean
        public Queue autoDeleteQueue2() {
            return new AnonymousQueue();
        }

        //队列和交换机绑定
        //这种关系可以读作:这个队列对这个交换器里的消息感兴趣。
        //虽然 Queue类型有多个实例,但spring会自动更加名字匹配,bean名字匹配参数名字
        @Bean
        public Binding binding1(FanoutExchange fanout, Queue autoDeleteQueue1) {
            return BindingBuilder.bind(autoDeleteQueue1).to(fanout);
        }

        @Bean
        public Binding binding2(FanoutExchange fanout, Queue autoDeleteQueue2) {
            return BindingBuilder.bind(autoDeleteQueue2).to(fanout);
        }




    }


}
@Service
public class Tut3Sender {
    private Logger logger = LoggerFactory.getLogger(Tut3Sender.class);
    @Autowired
    private RabbitTemplate template;

    @Autowired
    private FanoutExchange fanout;

    int dots = 0;
    int count = 0;

    public void send(){
        StringBuilder builder = new StringBuilder("Hello");
        if(dots++ == 3){
            dots = 1;
        }
        for(int i =0;i<dots;i++){
            builder.append(".");
        }
        builder.append(Integer.toString(++count));
        String message = builder.toString();
        //向交换机发送信息
        template.convertAndSend(fanout.getName(),"", message);
        logger.info(" [x] Sent '" + message + "'");
    }
}

@RabbitListener 监听队列情况,属性queues为队列名数组

@Component
public class Tut3Receiver {
    private Logger logger = LoggerFactory.getLogger(Tut3Receiver.class);

    @RabbitListener(queues="#{autoDeleteQueue1.name}")
    public void receive1(String in ) throws InterruptedException{
        receive(in,1);
    }

    @RabbitListener(queues="#{autoDeleteQueue2.name}")
    public void receive2(String in ) throws InterruptedException{
        receive(in,2);
    }

    public void receive(String in, int receiver) throws InterruptedException {
        StopWatch watch = new StopWatch();
        watch.start();
        logger.info("instance " + receiver + " [x] Received '" + in + "'");
        doWork(in);
        watch.stop();
        logger.info("instance " + receiver + " [x] Done in " + watch.getTotalTimeSeconds() + "s");
    }

    private void doWork(String in) throws InterruptedException {
        for (char ch : in.toCharArray()) {
            if (ch == '.') {
                Thread.sleep(1000);
            }
        }
    }
}

 

写一个Controller进行接口测试

@Controller
public class RabbitMqController {

    //发布
    @Autowired
    private Tut3Sender tut3Sender;
      

    @RequestMapping("/sendFanout")
    @ResponseBody
    private String sendFanout(){
        for(int i =0;i<10;i++) {
            tut3Sender.send();
        }
        return "ok";
    }


}

二、路由

 

@Configuration
public class RabbitMqExchangeConfig {

   
    /**
     * 广播交换器
     * @return
     */
    @Bean
    public FanoutExchange fanout(){
        return  new FanoutExchange("tut.fanout");
    }


    /**
     * @Bean 通过使用静态类封闭
     */
    private static class DirectConfig{

        @Bean
        public Queue autoDeleteQueue3() {
            return new AnonymousQueue();
        }

        @Bean
        public Queue autoDeleteQueue4() {
            return new AnonymousQueue();
        }

        //                orange  ->queue3
        //  tut.direct -> black   ->queue3,queue4
        //                green   ->queue4
        //


        @Bean
        public Binding binding1a(DirectExchange direct, Queue autoDeleteQueue3) {
            return BindingBuilder.bind(autoDeleteQueue3).to(direct).with("orange");
        }

        @Bean
        public Binding binding1b(DirectExchange direct, Queue autoDeleteQueue3) {
            return BindingBuilder.bind(autoDeleteQueue3).to(direct).with("black");
        }

        @Bean
        public Binding binding2a(DirectExchange direct, Queue autoDeleteQueue4) {
            return BindingBuilder.bind(autoDeleteQueue4).to(direct).with("green");
        }

        @Bean
        public Binding binding2b(DirectExchange direct, Queue autoDeleteQueue4) {
            return BindingBuilder.bind(autoDeleteQueue4).to(direct).with("black");
        }

    }
   

}

 

@Service
public class Tut4Sender {
    private Logger logger = LoggerFactory.getLogger(Tut4Sender.class);

    @Autowired
    private RabbitTemplate template;

    @Autowired
    private DirectExchange direct;

    private int index;

    private int count;

    private final String[] keys = {"orange", "black", "green"};

    /**
     * 三次分发给不同的 key
     */
    public void send() {
        StringBuilder builder = new StringBuilder("Hello to ");
        if (++this.index == 3) {
            this.index = 0;
        }
        String key = keys[this.index];
        builder.append(key).append(' ');
        builder.append(Integer.toString(++this.count));
        String message = builder.toString();
        template.convertAndSend(direct.getName(), key, message);
        logger.info(" [x] Sent '" + message + "'");
    }
}
@Component
public class Tut3Receiver {
    private Logger logger = LoggerFactory.getLogger(Tut3Receiver.class);
 

    @RabbitListener(queues="#{autoDeleteQueue3.name}")
    public void receive3(String in ) throws InterruptedException{
        receive(in,3);
    }

    @RabbitListener(queues="#{autoDeleteQueue4.name}")
    public void receive4(String in ) throws InterruptedException{
        receive(in,4);
    }


    public void receive(String in, int receiver) throws InterruptedException {
        StopWatch watch = new StopWatch();
        watch.start();
        logger.info("instance " + receiver + " [x] Received '" + in + "'");
        doWork(in);
        watch.stop();
        logger.info("instance " + receiver + " [x] Done in " + watch.getTotalTimeSeconds() + "s");
    }

    private void doWork(String in) throws InterruptedException {
        for (char ch : in.toCharArray()) {
            if (ch == '.') {
                Thread.sleep(1000);
            }
        }
    }
}

 

三、主题

@Configuration
public class RabbitMqExchangeConfig {

    
    /**
     * 主题交换器
     * @return
     */
    @Bean
    public TopicExchange topic() {
        return new TopicExchange("tut.topic");
    }

    private static class TopicConfig{
        @Bean
        public Queue autoDeleteQueue5() {
            return new AnonymousQueue();
        }

        @Bean
        public Queue autoDeleteQueue6() {
            return new AnonymousQueue();
        }

        //              *.orange.* ->queue5
        // tut.topic -> *.*.rabbit->queue5
        //              lazy.#    ->queue6

        //星号匹配一个单词,哈希号匹配多个单词
        @Bean
        public Binding binding3a(TopicExchange topic,Queue autoDeleteQueue5){
            return BindingBuilder.bind(autoDeleteQueue5).to(topic).with("*.orange.*");
        }

        @Bean
        public Binding binding3b(TopicExchange topic,Queue autoDeleteQueue5){
            return BindingBuilder.bind(autoDeleteQueue5).to(topic).with("*.*.rabbit");
        }

        @Bean
        public Binding binding4a(TopicExchange topic,Queue autoDeleteQueue6){
            return BindingBuilder.bind(autoDeleteQueue6).to(topic).with("lazy.#");
        }


    }
 


}
@Service
public class Tut5Sender {
    private Logger logger = LoggerFactory.getLogger(Tut5Sender.class);
    @Autowired
    private RabbitTemplate template;

    @Autowired
    private TopicExchange topic;

    private int index;

    private int count;

    private final String[] keys = {"quick.orange.rabbit",
            "lazy.orange.elephant", "quick.orange.fox",
            "lazy.brown.fox", "lazy.pink.rabbit", "quick.brown.fox"};

    public void send() {
        StringBuilder builder = new StringBuilder("Hello to ");
        if (++this.index == keys.length) {
            this.index = 0;
        }
        String key = keys[this.index];
        builder.append(key).append(' ');
        builder.append(Integer.toString(++this.count));
        String message = builder.toString();
        template.convertAndSend(topic.getName(), key, message);
        logger.info(" [x] Sent '" + message + "'");
    }

}

 

@Component
public class Tut3Receiver {
    private Logger logger = LoggerFactory.getLogger(Tut3Receiver.class);

    @RabbitListener(queues="#{autoDeleteQueue5.name}")
    public void receive5(String in ) throws InterruptedException{
        receive(in,5);
    }

    @RabbitListener(queues="#{autoDeleteQueue6.name}")
    public void receive6(String in ) throws InterruptedException{
        receive(in,6);
    }



    public void receive(String in, int receiver) throws InterruptedException {
        StopWatch watch = new StopWatch();
        watch.start();
        logger.info("instance " + receiver + " [x] Received '" + in + "'");
        doWork(in);
        watch.stop();
        logger.info("instance " + receiver + " [x] Done in " + watch.getTotalTimeSeconds() + "s");
    }

    private void doWork(String in) throws InterruptedException {
        for (char ch : in.toCharArray()) {
            if (ch == '.') {
                Thread.sleep(1000);
            }
        }
    }
}

 

 

参考:rabbit tutorials

          spring amqp reference

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Spring Boot 整合 RabbitMQ 的详细示例: 1. 引入依赖 在 pom.xml 文件中引入以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置 RabbitMQ 在 application.properties 文件中配置 RabbitMQ: ```properties spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3. 创建生产者 创建一个生产者(Producer)类,用于发送消息到 RabbitMQ: ```java @Component public class Producer { @Autowired private RabbitTemplate rabbitTemplate; public void send(String message) { rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message); } } ``` 4. 创建消费者 创建一个消费者(Consumer)类,用于从 RabbitMQ 接收消息: ```java @Component public class Consumer { @RabbitListener(queues = "myQueue") public void receive(String message) { System.out.println("Received message: " + message); } } ``` 5. 创建队列、交换机、绑定关系 使用 RabbitAdmin 类创建队列、交换机、绑定关系: ```java @Configuration public class RabbitConfig { @Autowired private RabbitTemplate rabbitTemplate; @PostConstruct public void setup() { RabbitAdmin rabbitAdmin = new RabbitAdmin(rabbitTemplate.getConnectionFactory()); Queue queue = new Queue("myQueue", true); DirectExchange exchange = new DirectExchange("myExchange", true, false); rabbitAdmin.declareQueue(queue); rabbitAdmin.declareExchange(exchange); rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with("myRoutingKey")); } } ``` 6. 测试 在控制器(Controller)中调用生产者发送消息,测试消费者是否成功接收消息: ```java @RestController public class TestController { @Autowired private Producer producer; @GetMapping("/test") public String test() { producer.send("Hello, RabbitMQ!"); return "Message sent."; } } ``` 以上就是 Spring Boot 整合 RabbitMQ 的详细示例,希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值