RabbitMQ第三章

  • Routing(路由模式):
    在这里插入图片描述

代码实践

public class Produce_RoutingKey {

    private static final String QUEUE_SMS = "queue_inform_sms"; //短信队列名
    private static final String QUEUE_EMAIL = "queue_inform_email"; //邮件队列名
    private static final String ROUTINGKEY_SMS = "routingkey_sms"; //短信队列key
    private static final String ROUTINGKEY_EMAIL = "routingkey_email"; //邮件队列key
    private static final String EXCHANGE_ROUTING_INFORM = "exchange_routing_inform"; //交换机

    public static void main(String[] args) {

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(QUEUE_SMS,true,false,false,null); //监听QUEUE_SMS队列
            channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);//监听QUEUE_EMAIL队列
            channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.DIRECT); //创建交换机
            channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS);//QUEUE_SMS队列与ROUTINGKEY_SMS交换机绑定
            channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL);//QUEUE_EMAIL队列与ROUTINGKEY_EMAIL交换机绑定

            //QUEUE_SMS QUEUE_EMAIL 绑定同一EXCHANGE_ROUTING_INFORM  同一 info_public
            channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,"info_public");
            channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,"info_public");


            for (int i=0;i<5;i++) {
/*
                String message_sms = "rabbitmq routing sms";
                channel.basicPublish(EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS,null,message_sms.getBytes());

                String message_email = "rabbitmq routing email";
                channel.basicPublish(EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL,null,message_email.getBytes());
*/
                //交换机根据info_public 转发至队列
                String message = "rabbitmq routing info";
                channel.basicPublish(EXCHANGE_ROUTING_INFORM,"info_public",null,message.getBytes());

            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                channel.close();
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
public class Consumer_RoutingKey_SMS {

    private static final String QUEUE_SMS = "queue_inform_sms"; //短信队列名
    private static final String ROUTINGKEY_SMS = "routingkey_sms"; //短信队列key
    private static final String EXCHANGE_ROUTING_INFORM = "exchange_routing_inform"; //交换机

    public static void main(String[] args) {

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(QUEUE_SMS,true,false,false,null);
            channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.DIRECT);
            channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS);

            DefaultConsumer 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);
                }
            };
            channel.basicConsume(QUEUE_SMS,true,consumer);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
public class Consumer_RoutingKey_Email {

    private static final String QUEUE_EMAIL = "queue_inform_email"; //邮件队列名
    private static final String ROUTINGKEY_EMAIL = "routingkey_email"; //邮件队列key
    private static final String EXCHANGE_ROUTING_INFORM = "exchange_routing_inform"; //交换机

    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;

        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);
            channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.DIRECT);
            channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL);

            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);
                }
            };
            channel.basicConsume(QUEUE_EMAIL,true,consumer);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

一个交换机绑定多个队列,每个队列设置routingkey,并且每个队列可以设置多个routingkey,消费者监听自己队列,生产者将消息发送至交换机,发送的消息需要指定routingkey那么交换机就会根据routingkey的值找到队列将消息转发到队列里。

  • Tocpic(通配符模式):

通配符模式和路由模式相似,只不过rotingkey的匹配方式不一样。
符号#:匹配一个或多个词,(每个词以.分割) 比如inform.#可以匹配inform.email,inform.sms.abc.haha等
符号*:只能匹配一个词,比如inform.*可以匹配inform.email,inform.sms等

代码实践:

public class Produce_Topics {

    private static final String QUEUE_SMS = "queue_inform_sms"; //短信队列名
    private static final String QUEUE_EMAIL = "queue_inform_email"; //邮件队列名
    private static final String ROUTINGKEY_SMS = "routingkey.#.sms.#"; //统配符匹配 短信队列key
    private static final String ROUTINGKEY_EMAIL = "routingkey.#.email.#"; //统配符匹配 邮件队列key
    private static final String EXCHANGE_ROUTING_INFORM = "exchange_topic_inform"; //交换机

    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;

        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(QUEUE_SMS,true,false,false,null); //监听QUEUE_SMS队列
            channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);//监听QUEUE_EMAIL队列
            channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.TOPIC); //创建交换机
            channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS);//QUEUE_SMS队列与ROUTINGKEY_SMS交换机绑定
            channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL);//QUEUE_EMAIL队列与ROUTINGKEY_EMAIL交换机绑定

            for(int i=0;i<5;i++) {
                String message = "rabbitmq routing email";
                channel.basicPublish(EXCHANGE_ROUTING_INFORM,"routingkey.email",null,message.getBytes());
            }

            for(int i=0;i<5;i++) {
                String message = "rabbitmq routing sms";
                channel.basicPublish(EXCHANGE_ROUTING_INFORM,"routingkey.sms",null,message.getBytes());
            }

            for(int i=0;i<5;i++) {
                String message = "rabbitmq routing info";
                channel.basicPublish(EXCHANGE_ROUTING_INFORM,"routingkey.email.sms",null,message.getBytes());

            }/**/
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                channel.close();
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
public class Consumer_Topics_Email {
    private static final String QUEUE_EMAIL = "queue_inform_email"; //邮件队列名
    private static final String ROUTINGKEY_EMAIL = "routingkey.#.email.#"; //统配符匹配 邮件队列key
    private static final String EXCHANGE_ROUTING_INFORM = "exchange_topic_inform"; //交换机

    public static void main(String[] args) {

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;

        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);
            channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.TOPIC);
            channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL);

            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);
                }
            };
            channel.basicConsume(QUEUE_EMAIL,true, consumer);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
public class Consumer_Topics_SMS {

    private static final String QUEUE_SMS = "queue_inform_sms"; //短信队列名
    private static final String ROUTINGKEY_SMS = "routingkey.#.sms.#"; //统配符匹配 短信队列key
    private static final String EXCHANGE_ROUTING_INFORM = "exchange_topic_inform"; //交换机

    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;

        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            channel.queueDeclare(QUEUE_SMS,true,false,false,null);
            channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.TOPIC);
            channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS);

            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);
                }
            };
            channel.basicConsume(QUEUE_SMS,true, consumer);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • Header(模式):
    Header取消使用rotingkey,使用header中的键值对(K/V)进行匹配。
发布了19 篇原创文章 · 获赞 8 · 访问量 806

猜你喜欢

转载自blog.csdn.net/ysl_20190905/article/details/100715174