rabbitmq发布订阅模式


rabbitmq发布订阅模式

将接收到的所有消息广播到它知道的所有队列中,对应的交换机类型为fanout

代码实现

消费者A

package com.yl.pubsub;

import com.rabbitmq.client.*;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;

import java.io.IOException;

/**
 * 消费者A
 *
 * @author Y-wee
 */
public class ConsumerA {

    public static void main(String[] args) throws IOException {
        Connection connection = RabbitUtils.getConnection();
        Channel channel = connection.createChannel();
        // 声明一个交换机
        channel.exchangeDeclare(RabbitConstant.EXCHANGE_PUBSUB, BuiltinExchangeType.FANOUT);
        // 声明一个临时队列,当消费者与队列断开连接,队列就会自动删除
        String queue = channel.queueDeclare().getQueue();
        // 将队列与交换机绑定
        channel.queueBind(queue, RabbitConstant.EXCHANGE_PUBSUB,"");

        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("ConsumerA接收到消息:"+new String(message.getBody()));
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };

        CancelCallback cancelCallback = (consumerTag) -> {
            System.out.println("消费失败");
        };

        channel.basicConsume(queue, false, deliverCallback, cancelCallback);
    }

}

RabbitUtils是笔者自定义的一个工具类,用来获取连接

RabbitConstant是笔者自定义的一个常量类,里面存储了队列名和交换机名

消费者B

package com.yl.pubsub;

import com.rabbitmq.client.*;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;

import java.io.IOException;

/**
 * 消费者B
 *
 * @author Y-wee
 */
public class ConsumerB {

    public static void main(String[] args) throws IOException {
        Connection connection = RabbitUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(RabbitConstant.EXCHANGE_PUBSUB, BuiltinExchangeType.FANOUT);
        String queue = channel.queueDeclare().getQueue();
        channel.queueBind(queue, RabbitConstant.EXCHANGE_PUBSUB,"");

        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("ConsumerB接收到消息:"+new String(message.getBody()));
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };

        CancelCallback cancelCallback = (consumerTag) -> {
            System.out.println("消费失败");
        };

        channel.basicConsume(queue, false, deliverCallback, cancelCallback);
    }

}

生产者

package com.yl.pubsub;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;

import java.io.IOException;
import java.util.Scanner;

/**
 * 生产者
 *
 * @author Y-wee
 */
public class Provider {

    public static void main(String[] args) throws IOException {
        Connection connection = RabbitUtils.getConnection();
        Channel channel = connection.createChannel();

        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext()){
            String message=scanner.next();
            channel.basicPublish(RabbitConstant.EXCHANGE_PUBSUB,"",null,message.getBytes());
            System.out.println("生产者发出消息:"+message);
        }
    }

}

结果:两个消费者都能收到生产者发送的消息