RabbitMq topic

目录

概述

代码

结果


概述

上篇direct必须是生产者发布消息指定的routingKey和消费者在队列绑定时指定的routingKey完全相等时才能匹配到队列上。topic与direct不同,可以进行模糊匹配。topic交换机的消息不能随意的设置选择routingKey,必须是由点隔开的一系列的标识符组成。标识符可以是任何东西,但是一般都与消息的某些特性相关。例子:“link.orange.rabbit”,你可以定义任何数量的标识符,上限为255个字节

匹配规则:

*  其中星号可以代替一个单词

#  可以替代零个或更多的单词,只要能模糊匹配上就能将消息映射到队列中。当一个队列的绑定键为#的时候,这个队列将会无视消息的路由键,接收所有的消息

注:队列1 将接受warn相关的消息

      队列2 将接受info 相关消息 debugger所有消息

代码

生产者

package com.ll.mq.hellomq.topic;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * 
 * @author ll 生产者
 *
 */
public class Producer {


	public static void main(String[] args) {
		try {
			ConnectionFactory factory = new ConnectionFactory();
			factory.setHost("127.0.0.1");
			factory.setPort(5672);
			factory.setUsername("kysc");
			factory.setPassword("123456");
			Connection connection = factory.newConnection();
			Channel channel = connection.createChannel();

			// Routing 的路由规则使用直连接
			String EXCHANGE_NAME = "exchange.topic";
			String[] routingKeys = { "link.warn.rabbit", "link.warn.elephant", "debugger.info"};
			for (String routingKey : routingKeys) {
				String message = "Hello RabbitMQ - " + routingKey;
				System.out.println(message);
				channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));
			}
			// 关闭资源
			channel.close();
			connection.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

消费者1

package com.ll.mq.hellomq.topic;

import java.io.IOException;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
 * 
 * @author ll 消费者1
 *
 */
public class ConsumerOne {

	static String EXCHANGE_NAME = "exchange.topic";
    static String QUEUE_NAME = "queue.topic.q1";
	public static void main(String[] argv) throws Exception {
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("localhost");
		factory.setPort(5672);
		factory.setUsername("kysc");
		factory.setPassword("123456");
		Connection connection = factory.newConnection();
		Channel channel = connection.createChannel();
		// 声明交换机类型
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");

        String[] routingKeys = {"*.warn.*"};
        for (int i = 0; i < routingKeys.length; i++) {
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, routingKeys[i]);
        }

        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println(" [C] ConsumerOne '" + message + "', 接受...");
            }
        };

        channel.basicConsume(QUEUE_NAME, true, consumer);
	}
}

消费者2

package com.ll.mq.hellomq.topic;

import java.io.IOException;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
 * 
 * @author ll 消费者2
 *
 */
public class ConsumerTwo {

	static String EXCHANGE_NAME = "exchange.topic";
    static String QUEUE_NAME = "queue.topic.q2";
	public static void main(String[] argv) throws Exception {
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("localhost");
		factory.setPort(5672);
		factory.setUsername("kysc");
		factory.setPassword("123456");
		Connection connection = factory.newConnection();
		Channel channel = connection.createChannel();
		// 声明交换机类型
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");

        String[] routingKeys = {"debugger.#"};
        for (int i = 0; i < routingKeys.length; i++) {
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, routingKeys[i]);
        }

        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println(" [C] ConsumerTwo '" + message + "', 接受中...");
            }
        };

        channel.basicConsume(QUEUE_NAME, true, consumer);
	}
}

 

结果

生产者:Hello RabbitMQ - link.warn.rabbit
              Hello RabbitMQ - link.warn.elephant
              Hello RabbitMQ - debugger.info

消费者1  [C] ConsumerOne 'Hello RabbitMQ - link.warn.rabbit', 接受...
               [C] ConsumerOne 'Hello RabbitMQ - link.warn.elephant', 接受...

消费者2  [C] ConsumerTwo 'Hello RabbitMQ - debugger.info', 接受中...

下一篇 https://blog.csdn.net/lilongwangyamin/article/details/105118955 rabbitmq rpc远程过程调用 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值