【中间件】MQ Rabbitmq 简单队列、work模式 笔记

原创 2018年04月17日 19:11:43

前言:
     纯属个人笔记

5种队列

面试的时候提了一下这个Q,虽然笔记做的很详细但是忘记了所以面的时候有点小尴尬,为了证明自己学过,诺、笔记搬上了
正文:

简单队列

pom文件:

<dependencies>
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>3.4.1</version>
    </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>1.4.0.RELEASE</version>
        </dependency>

    </dependencies>

代码

获取连接:

public static Connection getConnection() throws Exception {
        //定义连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置服务地址
        factory.setHost("127.0.0.1");
        //端口
        factory.setPort(5672);
        //设置账号信息,用户名、密码、vhost
        factory.setVirtualHost("/taotao");
        factory.setUsername("taotao");
        factory.setPassword("taotao");
        // 通过工程获取连接
        Connection connection = factory.newConnection();
        return connection;
    }

发送消息:

  private final static String QUEUE_NAME = "test_queue";

    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);

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

        //关闭通道和连接
        channel.close();
        connection.close();
    }

接受端:

   private final static String QUEUE_NAME = "test_queue";

    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);

        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列 等待队列,一有消息马上获取,自动确认,只要接收到即被成功消费
        channel.basicConsume(QUEUE_NAME, true, consumer);

        // 获取消息,消息被消费了就没有了,没有了则等待 有消息消费 没有等待
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" [x] Received '" + message + "'");
        }
    }

work模式:

   一个生产者多个消费者:只被一个消费者获取:共同监听一个队列,消费者休眠时间不一样,其他相同

发送端

private final static String QUEUE_NAME = "test_queue_work";

    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);
       //多的东西
        for (int i = 0; i < 50; i++) {
            // 消息内容
            String message = "" + i;
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");

            Thread.sleep(i * 10);
        }

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

接收端:1、2

private final static String QUEUE_NAME = "test_queue_work";

    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.basicQos(1);

        // 定义队列的消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 监听队列,消息确认方式:手动返回完成状态 (第二个参数为false)
        channel.basicConsume(QUEUE_NAME, false, consumer);

        // 获取消息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" [x] Received '" + message + "'");
            //休眠,正在处理
            Thread.sleep(10);
            // 向服务端 返回 确认状态
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }
接收端二:
private final static String QUEUE_NAME = "test_queue_work";

    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.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(" [x] Received '" + message + "'");
            // 休眠1秒,时间较长,上面basicQos使得能者多劳,不是根据数量均匀分配消息给消费端
            Thread.sleep(1000);
    //手动确认,需要添加下方代码
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }

     我感觉本质上是一样的,之后要说的虽然比前边这两个更加的灵活,但是个人感觉用法差不多,万变不离其宗

版权声明:欢迎大家的阅读,注明出处便可转载;学习过程中的笔记,厚着脸皮选了原创 https://blog.csdn.net/ma15732625261/article/details/79979218

RabbitMQ消息分发模式----"Work Queues"模式

2、Workqueues工作队列模式: 上篇博客我们完成了一个简单的对声明的队列进行发送和接受消息程序。下面我们将创建一个工作队列,来向多个工作者(consumer)分发耗时任务。 今天我们来看工...
  • a491857321
  • a491857321
  • 2016-01-25 23:13:53
  • 2506

关于RabbitMQ交换机的理解

RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消...
  • u011466674
  • u011466674
  • 2016-07-20 19:06:45
  • 3267

RabbitMQ入门与消息队列模式详解

RabbitMQ提供了6种模式,分别是HelloWorld,Work Queue,Publish/Subscribe,Routing,Topics,RPC Request/reply,本文详细讲述了前...
  • fysuccess
  • fysuccess
  • 2017-04-20 16:20:37
  • 4654

中间件系列三 RabbitMQ之交换机的四种类型和属性

概述本文介绍RabbitMQ中交换机的内容 交换机的作用 交换机的类型:Direct exchange(直连交换机)、Fanout exchange(扇型交换机)、Topic exchange(主题交...
  • hry2015
  • hry2015
  • 2018-01-23 19:55:32
  • 307

【中间件】消息队列(一):RabbitMQ、ActiveMQ、Kafka和Redis

消息队列中间件
  • shandianke
  • shandianke
  • 2016-07-31 18:42:42
  • 6524

RabbitMQ Java Work Queues(工作队列)

本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与实验,内容仅供参考。 上一篇博客中我们写了通过一个命名的队列发送和接收消息,如果你还不了解请点击:RabbitMQ 入门 Hell...
  • xiaofei15135161280
  • xiaofei15135161280
  • 2016-08-24 11:23:59
  • 1192

Redis与RabbitMQ作为消息队列的比较

本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比 具体采用什么方式实现,还需要取决于系统的实际需求 简要介绍   RabbitMQ RabbitMQ是实现AM...
  • u011510502
  • u011510502
  • 2017-04-01 17:54:26
  • 3169

RabbitMQ 工作队列模式(Work queues)

1介绍1.1工作模式和简单模式的区别durable(是否持久化): 这个参数改成true,表示需要持久化。当然如果rabbitmq接受到消息但还没有保存的时候,突然挂了,这样消息仍然会丢失。(send...
  • cj337083172
  • cj337083172
  • 2018-03-28 16:50:05
  • 16

第3篇 RabbitMQ的5种模式与实例

3.1 简单模式Hello World 功能:一个生产者P发送消息到队列Q,一个消费者C接收 生产者实现思路: 创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号...
  • u010753907
  • u010753907
  • 2017-06-07 17:51:21
  • 1989

RabbitMQ 的请求/响应模式

如果你正在进行web服务编程,那么最常用的模式是请求-响应模式。这种模式总是由客户端发起,然后等待服务器端的响应。如果客户端想发送一些信息给服务器,或者客户端按照某些标准请求一些信息,那么这种模式非常...
  • u013128318
  • u013128318
  • 2013-12-31 15:52:43
  • 1490
收藏助手
不良信息举报
您举报文章:【中间件】MQ Rabbitmq 简单队列、work模式 笔记
举报原因:
原因补充:

(最多只允许输入30个字)