Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!这种模型Routingkey 一般都是由一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
# 统配符 * (star) can substitute for exactly one word. 匹配不多不少恰好1个词 # (hash) can substitute for zero or more words. 匹配一个或多个词 # 如: audit.# 匹配audit.irs.corporate或者 audit.irs 等 audit.* 只能匹配 audit.irs
1.开发生产者
以下省略的前面的重复 *** 作,只贴出关键代码
//生命交换机和交换机类型 topic 使用动态路由(通配符方式) channel.exchangeDeclare("topics","topic"); String routekey = "user.save";//动态路由key //发布消息 channel.basicPublish("topics",routekey,null,("这是路由中的动态订阅模型,route key: ["+routekey+"]").getBytes());
2.开发消费者-1
Routing Key中使用*通配符方式
//声明交换机 channel.exchangeDeclare("topics","topic"); //创建临时队列 String queue = channel.queueDeclare().getQueue(); //绑定队列与交换机并设置获取交换机中动态路由 channel.queueBind(queue,"topics","user.*"); //消费消息 channel.basicConsume(queue,true,new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消费者1: "+new String(body)); } });
3.开发消费者-2
Routing Key中使用#通配符方式
//声明交换机 channel.exchangeDeclare("topics","topic"); //创建临时队列 String queue = channel.queueDeclare().getQueue(); //绑定队列与交换机并设置获取交换机中动态路由 channel.queueBind(queue,"topics","user.#"); //消费消息 channel.basicConsume(queue,true,new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("消费者2: "+new String(body)); } });
4.测试结果
可以发现只要满足通配符条件的routekey是都可以订阅到消息
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)