1.架构图
模式简介:
-
broker一个队列可以比喻作是一个邮箱。它存在于RabbitMQ中。虽然消息的传输需要通过RabbitMQ和你的应用程序,这些消息只能保存在队列中。一个队列是没有什么约束和限制的,只要你愿意它可以存储很多消息,本质上来说它就是一个无穷的缓冲区。许多消息生产者可以向一个发送消息,同样许多消费者可以尝试接收一个队列中的消息。下图所示就是一个队列
- producer 生产者”其实和“消息发送”意思差不多。代表一个发送消息的生产者.
- consumer 消费也可以理解为接收。一个接收者就是一个等待接收消息的程序
- 生产者、消费者、中间件不必在同一台机器上。事实上他们应用当中没有在一台机器上。(rabbitmq部署到linux服务器,生产者和消费者分别在两个应用程序中,比如在订单系统和库存系统中)
2.实践应用
2.1 生产者
package com.rabbitmq.producer; import com.rabbitmq.client.Connection; import com.rabbitmq.utils.ConnectUtil; import com.rabbitmq.client.Channel; public class Producer1 { private static String QUEUE_NAME = "test_queue"; public static void main(String[] argv) throws Exception{ //获得连接 Connection con = ConnectUtil.getConnection(); //获得通道 Channel channel = con.createChannel(); //声明创建队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); //消息内容 String message = "hello world!"; //发送消息队列 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); //发送成功,打印发送信息 System.out.println("生产者发送消息是:"+message); //关闭通道和连接 channel.close(); con.close(); } }
2.2 消费者
package com.rabbitmq.consumer; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.QueueingConsumer; import com.rabbitmq.client.QueueingConsumer.Delivery; import com.rabbitmq.utils.ConnectUtil; public class Consumer { private static String QUEUE_NAME = "test_queue"; public static void main(String[] argv) throws Exception{ //获得连接 Connection con = ConnectUtil.getConnection(); //获得通道 Channel channel = con.createChannel(); //声明创建队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); //创建消息者 QueueingConsumer consumer = new QueueingConsumer(channel); //发送消息队列 channel.basicConsume(QUEUE_NAME, true, consumer); while(true){ Delivery delivery= consumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println("g 消费者接受的消息是:"+message); } } }