首页 > 其他分享 >Rabbitmq消息队列:Topic话题模式简单应用

Rabbitmq消息队列:Topic话题模式简单应用

时间:2023-11-03 17:12:10浏览次数:34  
标签:topic String EXCHANGE 队列 Rabbitmq Topic 交换机 GetOne channel

一、生产者

  声明topic话题模式的交换机,分别发送几条消息到不同的路由key。

package test.topic;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import utils.RabbitmqConUtil;

public class Give {

    //定义交换机
    private final static String EXCHANGE = "test-topic";

    public static void main(String[] args) throws Exception {
        //创建连接和通道
        Connection connection = RabbitmqConUtil.getConnection();
        Channel channel = connection.createChannel();
        //声明交换机(类型topic->话题模式)
        channel.exchangeDeclare(EXCHANGE,"topic");
        //发送消息到交换机(交换机无法持久化,如果消息没有及时接收,重启后容易丢失数据)
        channel.basicPublish(EXCHANGE,"GetOne.oneMessage",null,"这是发送给GetOne.oneMessage的消息".getBytes());
        channel.basicPublish(EXCHANGE,"GetThree.oneMessage.value",null,"这是发送给GetThree.oneMessage.value的消息".getBytes());
    }

}

  这几个消息的路由key嵌套了好几层,方便对于消息进行话题的分类整合。

二、消费者

  topic模式的重点在于:

  针对于上面生产者消息发送的路由key,可以通过" * "和" # "等通配符来进行模糊匹配。

  " * "代表匹配一层,即直接匹配,比如a.*可以匹配到a.b,但是无法匹配到a.b.c。

  " # "代表多层匹配,比如a.#可以匹配到a.b,a.c.a.d,也可以匹配到a.b.c.d.e,一直向后扩展

  创建消费者GetOne:

package test.topic;

import com.rabbitmq.client.*;
import utils.RabbitmqConUtil;

import java.io.IOException;

public class GetOne {

    private final static String EXCHANGE = "test-topic";
    //定义本消费者需要用到的队列
    private final static String QUEUE = "test-topic-one";

    public static void main(String[] args) throws Exception{
        Connection connection = RabbitmqConUtil.getConnection();
        final Channel channel = connection.createChannel();
        //声明队列
        channel.queueDeclare(QUEUE,false,false,false,null);
        //将队列绑定到交换机(第二个参数是路由的key,需要多个的话就绑多个)
        channel.queueBind(QUEUE,EXCHANGE,"GetOne.*");
        channel.queueBind(QUEUE,EXCHANGE,"GetThree.#");
        channel.basicQos(1);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String str = new String(body);
                System.out.println("GetOne接收:" + str);
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume(QUEUE,false,defaultConsumer);

    }
}

三、运行结果

  先运行生产者对交换机test-topic进行初始化。

  

  然后运行消费者GetOneGetOne.*GetThree.#两个通配规则的路由key绑定到交换机上。

  

  再次运行生产者发送消息,结果如下:

  

  两个消息都成功被GetOne接收。

  

标签:topic,String,EXCHANGE,队列,Rabbitmq,Topic,交换机,GetOne,channel
From: https://www.cnblogs.com/guobin-/p/17808010.html

相关文章

  • C语言 循环队列
    什么是队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。什么是循环队列在实际使用队列时,为了使队列空间能重复使用,往往对......
  • GO语言使用redis stream队列demo
    GO语言使用redisstream队列demopackagemainimport( "context" "fmt" "github.com/go-redis/redis/v8" "time")varclient*redis.Clientvarctxcontext.Contextvarkey="my_streamKey"//keyvarmyCons......
  • Rabbitmq消息队列:Route路由模式简单应用
    一、生产者在发布订阅模式的代码基础上,进行一定的调整,将声明交换机的路由模式调整为direct路由模式。这个时候需要用到路由key,类似于给消息用来分类的标签。分别发送三条消息,发向GetOne、GetTwo和GetThree三个路由key://声明交换机(类型direct->路由模式)channel......
  • Rabbitmq消息队列:Publish/Subscribe模式简单应用
    一、生产者packagetest.publish;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importutils.RabbitmqConUtil;publicclassGive{//定义交换机privatefinalstaticStringEXCHANGE="test-publish";publicstati......
  • 美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?
    这是一道面试中常见的Redis基础面试题,主要考察求职者对于Redis应用场景的了解。即使不准备面试也建议看看,实际开发中也能够用到。内容概览:Redis除了做缓存,还能做什么?分布式锁:通过Redis来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于Redisson来实现分布......
  • Java_消息队列
    消息系统MQ全称MessageQueue(消息队列)消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等,而部分数据库如Redis、MySQL以及phxsql也可实现消息队列的功能系统管理者MessageManager包括Apache的ActiveMQ,Apache的Kafka,RabbitMQ、memcacheQ消息类型......
  • 迭代加深,双向搜索,IDA*,A*,双端队列BFS
    迭代加深://迭代加深搜索//给搜索设定一个范围,如果在这个范围内没有答案那么再加大搜索范围//这么做是为了防止搜索过深,导致利用大量时间搜索无用信息//如果当前搜索是第10位,搜索的是个二叉树,那么前9个就是2^0+2^1+2^2+..+2^9=2^10-1,所以时间复杂度并没增大太多//htt......
  • Rabbitmq消息队列:Work模式简单应用
    一、生产者直接使用HelloWorld模式下的应用案例依赖和代码,将生产者Give类拷贝一份。将发送消息部分调整为遍历发送,连发10次://遍历发送多条消息for(inti=0;i<10;i++){//发送内容channel.basicPublish("",QUEUE,null,("这是第"+(i+1)+"条消息")......
  • 2023NOIP A层联测22 差后队列
    2023NOIPA层联测22差后队列挺有意思的期望题,题解做法应该是DP,但是我又双叒写出奇怪的做法……思路除去最大值外的元素个数的倒数就是这一轮取到某个数的概率,而最大值是特殊的情况,在被替代之前或作为最后一个数被弹出之前,不参与计算。对于操作0的输出和操作1的输出分开......
  • 队列和堆
    先说说队列,队列就是跟排队一样,从头部出去,从尾部进来,堆的话,可以把它理解为一本书,从最顶部(也就是尾巴进去),从最顶部出去 先说说队列,学了两种实现方式,一种是数列实现方式,一种是链表 先说说数列,数列要实现队列(不管是单向还是双端)的话,有个难点就是从头部操作,一般的操作,可能就是,后......