RabbitMQ

RabbitMQ服务端的安装

操作系统:CentOS7,使用docker容器安装

# 拉取镜像
docker pull rabbitmq:management
# 创建容器
docker run -e RABBIT_DEFAULT_USER=root -e RABBIT_DEFAULT_PASS=root --name rabbitmq_mg -p 15672:15672 -p 5672:5672 -d rabbitmq:management
# 访问管理页面
# http://10.10.0.100:15672
# root:root(如果登录失败,则选择guest:guest)

AMQP的Java客户端编程

AMQP:Advanced Message Queuing Protocol,即高级消息队列协议
(1)新建maven项目
pom文件引入amqp的依赖

<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.9.0</version>
        </dependency>

(2)发布消息

PublisherTest.java
	ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("10.10.0.100");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String message = scanner.next();
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println("[x]发送'" + message + "'");
        }
        channel.close();
        connection.close();

(3)消费消息

ConsumerTest.java
	ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("10.10.0.100");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.basicConsume(QUEUE_NAME, true, new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws
                    IOException {
                //处理消息
                String message = new String(body);
                System.out.println(" [x] Received '" + message + "'");
            }
        });
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

Spring AMQP的Java客户端编程

0.环境准备

(1)新建Spring boot项目
一个父工程springamqp,2个子工程publisher、consumer
(2)pom文件引入spring AMQP的依赖

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

(3)在application.yml中配置RabbitMQ

spring:
  rabbitmq:
    host: 10.10.0.100
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    listener:
      simple:
        prefetch: 1

1.Hello Word (简单的消息队列)

(1)发送

@Test
    public void publishSimpleQueue(){
        String  QUEUE_NAME="simple-queue";
        String message="hello,spring AMQP";
        rabbitTemplate.convertAndSend(QUEUE_NAME,message);
    }

(2)接收

@Component
public class RabbitMqListener {

    @RabbitListener(queues = "simple-queue")
    public void Listensimple(String message) throws InterruptedException {
        System.out.println("接收消息:'" + message + "'");
    }

2.Work Queues


(1)发送

  @Test
    public void publishWorkQueue() throws InterruptedException {
        String message="hello";
        String QUEUE_NAME="work-queue";
         for (int i = 1; i <=50 ; i++) {
            rabbitTemplate.convertAndSend(QUEUE_NAME,message+i);
            Thread.sleep(20);
         }
    }

(2)接收

@RabbitListener(queues = "work-queue")
    public void ListenMessage1(String message) throws InterruptedException {
        System.out.println("消费者1:'" + message + "'");
        Thread.sleep(  20);
    }

    @RabbitListener(queues = "work-queue")
    public void ListenMessage2(String message) throws InterruptedException {
        System.out.println("消费者2:'" + message + "'");
        Thread.sleep(200);
    }

3.publish-subscribe fanout exchange

(1)声明
声明交换机、队列及其绑定

FanoutConfig.java
@Configuration
public class FanoutConfig {

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

    @Bean
    public Queue fanoutQueue1(){
        return new Queue("fanout-queue1");
    }

    @Bean
    public Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange){
        return BindingBuilder
                .bind(fanoutQueue1)
                .to(fanoutExchange);
    }

    @Bean
    public Queue fanoutQueue2(){
        return new Queue("fanout-queue2");
    }

    @Bean
    public Binding bindingQueue2(Queue fanoutQueue2, FanoutExchange fanoutExchange){
        return BindingBuilder
                .bind(fanoutQueue2)
                .to(fanoutExchange);
    }

(2)发送

/**
     * publish-subscribe  fanout exchange 广播类型
     */
    @Test
    void publishFanoutQueue() {
        String fanoutExchange = "fanout-exchange";
        String message = "hello,everyone!";
        rabbitTemplate.convertAndSend(fanoutExchange,"", message);
    }

(3)接收

@Component
public class RabbitMqListener {

 @RabbitListener(queues = "fanout-queue1")
    public void ListenFanoutQueue1(String message) throws InterruptedException {
        System.out.println("queue1:'" + message + "'");
    }
     @RabbitListener(queues = "fanout-queue2")
    public void ListenFanoutQueue2(String message) throws InterruptedException {
        System.out.println("queue2:'" + message + "'");
    }
}

4.routing direct exchange

image

(1)发送

/**
     * routing  direct exchange 路由
     */
    @Test
    void publishDirectQueue() {
        String fanoutExchange = "direct-exchange";
        String message = "hello,boy!";
        String routingKey = "red";
        rabbitTemplate.convertAndSend(fanoutExchange, routingKey, message);
    }

(2)接收

 @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct-queue1"), exchange = @Exchange(name="direct-exchange"), key = {"red", "blue"}))
    public void ListenDirectQueue1(String message) throws InterruptedException {
        System.out.println("direct queue1:'" + message + "'");
    }

    @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct-queue2"), exchange = @Exchange(name="direct-exchange"), key = {"red", "yellow"}))
    public void ListenDirectQueue2(String message) throws InterruptedException {
        System.out.println("direct queue2:'" + message + "'");
    }

5.topics topic exchange

image
(1)发送

/**
     * topics  topic exchange
     */
    @Test
    void publishTopicQueue() {
        String exchange = "topic-exchange";
        String message = "hello,boy!";
        String routingKey = "china.sport";
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
    }

(2)接收

@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic-queue1"), exchange = @Exchange(name="topic-exchange",type = ExchangeTypes.TOPIC), key = "china.#"))
    public void ListenTopicQueue1(String message) throws InterruptedException {
        System.out.println("topic queue1:'" + message + "'");
    }

    @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic-queue2"), exchange = @Exchange(name="topic-exchange",type = ExchangeTypes.TOPIC), key = "#.news"))
    public void ListenTopicQueue2(String message) throws InterruptedException {
        System.out.println("topic queue2:'" + message + "'");
    }
posted @ 2023-11-21 11:37  框框A  阅读(3)  评论(0编辑  收藏  举报