RabbitMQ入门及常用的5种模式的简单使用(二)

RabbitMQ是一个非常常用也非常强大的消息中间件,主要用于应用与应用之间的通信,有五种常见的使用方式,分别是:简单模式,工作模式,发布订阅模式,路由模式以及通配符模式,这里主要是路由模式的三种具体实现!

发布订阅模式

package cn.itcast.rabbitmq.ps;


import cn.itcast.rabbitmq.util.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;


public class Send {


    private final static String EXCHANGE_NAME = "test_exchange_fanout";


    public static void main(String[] argv) throws Exception {
        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明exchange
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");


        // 消息内容
        String message = "Hello World!";
        channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");


        channel.close();
        connection.close();
    }

}



package cn.itcast.rabbitmq.ps;


import cn.itcast.rabbitmq.util.ConnectionUtil;


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


public class Recv {


    private final static String QUEUE_NAME = "test_queue_ps01";


    private final static String EXCHANGE_NAME = "test_exchange_fanout";


    public static void main(String[] argv) throws Exception {


        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);


        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");


        // 同一时刻服务器只会发一条消息给消费者
        channel.basicQos(1);


        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);


        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" 消费者1: '" + message + "'");
            Thread.sleep(10);


            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }

}


package cn.itcast.rabbitmq.ps;


import cn.itcast.rabbitmq.util.ConnectionUtil;


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


public class Recv2 {


    private final static String QUEUE_NAME = "test_queue_ps02";


    private final static String EXCHANGE_NAME = "test_exchange_fanout";


    public static void main(String[] argv) throws Exception {


        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);


        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");


        // 同一时刻服务器只会发一条消息给消费者
        channel.basicQos(1);


        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);


        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" 消费者2: '" + message + "'");
            Thread.sleep(10);


            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }

}


路由模式

package cn.itcast.rabbitmq.routing;


import cn.itcast.rabbitmq.util.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;


public class Send {


    private final static String EXCHANGE_NAME = "test_exchange_direct";


    public static void main(String[] argv) throws Exception {
        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明exchange
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");


        // 消息内容
        String message = "用户修改,id=10123";
        channel.basicPublish(EXCHANGE_NAME, "update", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");


        channel.close();
        connection.close();
    }

}


package cn.itcast.rabbitmq.routing;


import cn.itcast.rabbitmq.util.ConnectionUtil;


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


public class Recv {


    private final static String QUEUE_NAME = "test_queue_direct01";


    private final static String EXCHANGE_NAME = "test_exchange_direct";


    public static void main(String[] argv) throws Exception {


        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);


        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "error");
        // 同一时刻服务器只会发一条消息给消费者
        channel.basicQos(1);


        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);


        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("前台:'" + message + "'");
            Thread.sleep(10);


            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }

}


package cn.itcast.rabbitmq.routing;


import cn.itcast.rabbitmq.util.ConnectionUtil;


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


public class Recv2 {


    private final static String QUEUE_NAME = "test_queue_direct02";


    private final static String EXCHANGE_NAME = "test_exchange_direct";


    public static void main(String[] argv) throws Exception {


        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);


        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "insert");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "error");
        // 同一时刻服务器只会发一条消息给消费者
        channel.basicQos(1);


        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);


        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("搜索: '" + message + "'");
            Thread.sleep(10);


            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }
}

通配符模式

package cn.itcast.rabbitmq.topic;


import cn.itcast.rabbitmq.util.ConnectionUtil;


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


public class Send {


    private final static String EXCHANGE_NAME = "test_exchange_topic";


    public static void main(String[] argv) throws Exception {
        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明exchange
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");


        // 消息内容
        String message = "用户修改,id=155552";
        channel.basicPublish(EXCHANGE_NAME, "user.update", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");


        channel.close();
        connection.close();
    }

}


package cn.itcast.rabbitmq.topic;


import cn.itcast.rabbitmq.util.ConnectionUtil;


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


public class Recv {


    private final static String QUEUE_NAME = "test_queue_topic_01";


    private final static String EXCHANGE_NAME = "test_exchange_topic";


    public static void main(String[] argv) throws Exception {


        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);


        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "user.insert");
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "user.error");
        // 同一时刻服务器只会发一条消息给消费者
        channel.basicQos(1);


        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);


        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" 前台: '" + message + "'");
            Thread.sleep(10);


            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }

}


package cn.itcast.rabbitmq.topic;


import cn.itcast.rabbitmq.util.ConnectionUtil;


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


public class Recv2 {


    private final static String QUEUE_NAME = "test_queue_topic_02";


    private final static String EXCHANGE_NAME = "test_exchange_topic";


    public static void main(String[] argv) throws Exception {


        // 获取到连接以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();


        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);


        // 绑定队列到交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "user.*");


        // 同一时刻服务器只会发一条消息给消费者
        channel.basicQos(1);


        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,手动返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);


        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" 搜索:'" + message + "'");
            Thread.sleep(10);


            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }
}


你可能感兴趣的:(java技术)