RabbitMQ信息队列之二:消费者及劳动者

每当以RabbitMQ之前,需要了解RabbitMQ的劳作规律。

RabbitMQ的干活原理

RabbitMQ是信代理。从本质上说,它承受来自生产者的信息,并拿其传递让买主。在两者之间,它可因你受它们的路由,缓冲规则进行传递消息。

示例图

图片 1

RabbitMQ的术语说

劳动者:生产消息,发送信息。类似工厂。
买主:接受信息,使用信息。类似顾客。
列:存储消息。类似仓库、中转站。队列可以储存很多的信息,因为其多是一个随便的缓冲区,前提是公的机器发出足够的囤积空间。多只生产者可以用信息发送到与一个序列中,多独买主也得只是于和一个行接收数据。这便是排的特色。

RabbitMQ 信息生产者的代码实现

import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
public class RabbitProducer {
    private final static String QUEUE_NAME = "RabbitMQ_Hello"; //消息队列名

      public static void main(String[] argv) throws Exception {
         //创建连接连接到RabbitMQ 
        ConnectionFactory factory = new ConnectionFactory();
        // 设置ip
        factory.setHost("127.0.0.1");
        /*   //设置端口
        factory.setPort(15672);
        //设置用户名
        factory.setUsername("guest");
        //设置密码
        factory.setPassword("guest");
       //设置url(包括ip、端口、用户名、密码)
        factory.setUri("amqp://guest:guest@localhost:15672");
      */    
        // 创建一个连接  
        Connection connection = factory.newConnection();
        // 创建一个频道 
        Channel channel = connection.createChannel();
        // 指定一个队列  
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        Map<String,Object> map=new HashMap<String,Object>();  
          map.put("java", "hello");
          map.put("RabbitMQ", "Hello");
        //发送的消息
        String message = JSON.toJSONString(map); 
        // 往队列中发出一条消息 
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); 
        System.out.println(" [x] Sent '" + message + "'");
        // 关闭频道和连接  
        channel.close();
        connection.close();   
      }
}

RabbitMQ信消费者之代码实现

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

//消费者 
public class RabbitConsumer {

  private final static String QUEUE_NAME = "RabbitMQ_Hello"; //消息队列名

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

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
       // 打开连接和创建频道,与发送端一样  
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
     // 声明队列,主要为了防止消息接收者先运行此程序,队列还不存在时创建队列。  
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
      // 创建队列消费者  
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 指定消费队列
        channel.basicConsume(QUEUE_NAME, true, consumer);
        while (true) {  //消费者程序运行开着 如果生产者新增了数据会自动获取
          Thread.sleep(500);
             // nextDelivery是一个阻塞方法(内部实现其实是阻塞队列的take方法)  
          QueueingConsumer.Delivery delivery = consumer.nextDelivery();
          String message = new String(delivery.getBody());
          System.out.println("'[x] Received '" + message );
  }   
  }
}

打开当地的RabbitMQ,之后运行生产者代码,会用消息存储到RabbitMQ中,可以经过RabbitMQ
web界面看到信息。

图片 2

图片 3

图片 4

图片 5

运转消费者代码,会用该信息消费掉,可以当RabbitMQ
web界面可以发现上面存储的信息就没了。
图片 6

图片 7

经过之demo,可以本着信息队列有矣一个的基本的刺探了。