七、rabbitMQ Topics

来源:互联网 发布:模拟弹钢琴的软件 编辑:程序博客网 时间:2024/06/06 02:07

上一节我们学习了direct exchange ,这种exchange叫交换数据的时候是精确匹配routing_key.
这一节我们将学习topics exchange,他可以做到模糊匹配。
* 能够代替一个单词。#代表0个或多个单词。
有两点要注意:
1、不是出现*或#号都可以是代词,他们可能只是普通字符,两个.号之间的*或#(注:开头和结束要特殊一点)才能做代词。
2、这单词和我们普通理解的单词是不一样的,两个.号之间的所有内容称为一个单词(注:开头和结束要特殊一点)。
比如:“*#.orange@*.*” 这里只有最后一个*才是代词,一共有三个单词。


实例:每个动物都有三个属性 速度、颜色、种类,三种属性使用.符合进行分隔.
quick.orange.rabbit
lazy.orange.elephant
quick.brown.fox
lazy.pink.rabbit
quick.brown.dog
lazy.brown.cat


需求:队列1只接收颜色为orange的动物,队列接收兔子和速度为lazy的动物。





消费者1:

package test1;import com.rabbitmq.client.*;import java.io.IOException;public class consumer {    private final static String EXCHANGE_NAME = "logs_exchange";    public static void main(String[] args) {        ConnectionFactory factory = new ConnectionFactory();        factory.setUsername("guest");        factory.setPassword("guest");        factory.setHost("127.0.0.1");        factory.setVirtualHost("/");        factory.setPort(5672);        try {            final Connection connection = factory.newConnection();            final Channel channel = connection.createChannel();            channel.exchangeDeclare(EXCHANGE_NAME, "topic");//不存在时,创建exchange            String queueName = channel.queueDeclare().getQueue();//创建队列            channel.queueBind(queueName, EXCHANGE_NAME, "*.orange.*");//队列绑定到exchange//            channel.queueBind(queueName, EXCHANGE_NAME, "*.*.rabbit");//队列绑定到exchange//            channel.queueBind(queueName, EXCHANGE_NAME, "lazy.#");//队列绑定到exchange            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(message);                }            };            boolean autoAck = true;            channel.basicConsume(queueName, autoAck, consumer);            Thread.sleep(600 * 1000);            channel.close();            connection.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

消费者2:

package test1;import com.rabbitmq.client.*;import java.io.IOException;public class consumer {    private final static String EXCHANGE_NAME = "logs_exchange";    public static void main(String[] args) {        ConnectionFactory factory = new ConnectionFactory();        factory.setUsername("guest");        factory.setPassword("guest");        factory.setHost("127.0.0.1");        factory.setVirtualHost("/");        factory.setPort(5672);        try {            final Connection connection = factory.newConnection();            final Channel channel = connection.createChannel();            channel.exchangeDeclare(EXCHANGE_NAME, "topic");//不存在时,创建exchange            String queueName = channel.queueDeclare().getQueue();//创建队列//            channel.queueBind(queueName, EXCHANGE_NAME, "*.orange.*");//队列绑定到exchange            channel.queueBind(queueName, EXCHANGE_NAME, "*.*.rabbit");//队列绑定到exchange            channel.queueBind(queueName, EXCHANGE_NAME, "lazy.#");//队列绑定到exchange            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(message);                }            };            boolean autoAck = true;            channel.basicConsume(queueName, autoAck, consumer);            Thread.sleep(600 * 1000);            channel.close();            connection.close();        } catch (Exception e) {            e.printStackTrace();        }    }}


生产者:

package test1;import com.rabbitmq.client.*;import java.util.*;public class producter {    private final static String EXCHANGE_NAME = "logs_exchange";    public static void main(String[] args) {        ConnectionFactory factory = new ConnectionFactory();        factory.setUsername("guest");        factory.setPassword("guest");        factory.setHost("127.0.0.1");        factory.setVirtualHost("/");        factory.setPort(5672);        List<String > stringList=new ArrayList<String>();        stringList.add("quick.orange.rabbit");        stringList.add("lazy.orange.elephant");        stringList.add("quick.brown.fox");        stringList.add("lazy.orange.rabbit");        stringList.add("quick.brown.dog");        stringList.add("lazy.brown.cat");        try {            Connection connection = factory.newConnection();            Channel channel = connection.createChannel();            channel.exchangeDeclare(EXCHANGE_NAME, "topic");//不存在时,创建exchange            for (int i = 0;i  < stringList.size(); i++) {                channel.basicPublish(EXCHANGE_NAME, stringList.get(i), null,( "我是:"+ stringList.get(i)).getBytes());//消息发布到exchange            }            channel.close();            connection.close();        } catch (Exception e) {            e.printStackTrace();        }    }}


运行结果: