• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Y-wee
博客园    首页    新随笔    联系   管理     

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);
        }
    }

}

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

记得快乐
posted @ 2021-12-26 20:36  Y-wee  阅读(147)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3