RabbitMq初体验

简介:

RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。
AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ 是一个开源的 AMQP 实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

组成

  • 生产者
  • 消息队列
  • 消费者
  • 交换机:
    • 隔离生产者和消息队列,充当二者中间体。
    • 接受相应的消息并绑定到指定队列

发布模式

根据交换机类型不同,分为3种:

  1. Direct<直接>:1对1-----一个消息只能被一个消费者消费
  2. Topic<主题>:1对多-----一个消息可以被多个消费者消费
  3. Fanout<分列>:广播
注:一个发送者,N个接受者,经过测试会均匀的将消息发送到N个接收者中

整合springboot

pom

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

yml

spring:
  application:
    name: spring-boot-amqp
  rabbitmq:
    host: xxx.xxx.xxx.xxx
    port: 5672
    username: rabbit
    password: 123456

config

API:BindingBuilder.bind(指定队列).to(交换机).with(路由键);
package com.hxtec.polaris.configure;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * API:BindingBuilder.bind(指定队列).to(交换机).with(路由键);
 */
@Configuration
public class MyAMQPConfig {
    final static String tpm = "topic.message";
    final static String tp1m = "topic1.message";
    final static String tpm1 = "topic.message1";
    final static String tpm2 = "topic.message2";

    @Bean
    public Queue tpm() {
        return new Queue(MyAMQPConfig.tpm);
    }

    @Bean
    public Queue tp1m() {
        return new Queue(MyAMQPConfig.tp1m);
    }

    @Bean
    public Queue tpm1() {
        return new Queue(MyAMQPConfig.tpm1);
    }

    @Bean
    public Queue tpm2() {
        return new Queue(MyAMQPConfig.tpm2);
    }

    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("topic.exchange");
    }

    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout.exchange");
    }

    @Bean
    DirectExchange directExchange() {
        return new DirectExchange("direct.exchange");
    }

    /**
     * topic单播,只给topic.message发送
     * @param tpm
     * @param topicExchange
     * @return
     */
    @Bean
    Binding bindingTopicExchangeMessage(Queue tpm, TopicExchange topicExchange) {
        return BindingBuilder.bind(tpm).to(topicExchange).with("topic.message");
    }

    /**
     * Fanout广播,给绑定fanoutExchange的queues全部发送
     * @param tpm
     * @param fanoutExchange
     * @return
     */
    @Bean
    Binding bindingFanoutExchangeMessage(Queue tpm, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(tpm).to(fanoutExchange);
    }

    /**
     * 绑定规则
     * @param tpm
     * @param directExchange
     * @return
     */
    @Bean
    Binding bindingDirectExchangeMessage(Queue tpm,DirectExchange directExchange) {
        return BindingBuilder.bind(tpm).to(directExchange).with("topic.message#");
    }
}

sender

API:amqpTemplate.convertAndSend("交换机名",“路由键”,“消息内容”)
package com.hxtec.polaris.ampq;

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

import java.util.Date;

/**
 * API:amqpTemplate.convertAndSend("交换机名",“路由键”,“消息内容”)
 */
@Component
public class RabbitHelloSender {

	@Autowired
	private RabbitTemplate rabbitTemplate;

	public void send() {
		String context = "hello " + new Date();
		System.out.println("Sender : " + context);
		this.rabbitTemplate.convertAndSend("topic.exchange","tpm", context);
	}

}

receiver

@RabbitListener(queues = "direct"):监听器监听指定队列
package com.hxtec.polaris.ampq;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @RabbitListener(queues = "direct"):监听器监听指定队列
 */
@Component
@RabbitListener(queues = "topic.message")
public class RabbitHelloReceiver {

	@RabbitHandler
	public void process(String hello) {
		System.out.println("Receiver  : " + hello);
	}
}
posted @ 2020-04-26 14:51  彼时岸边  阅读(222)  评论(0编辑  收藏  举报