前言
RabbitMQ是消息代理:它接受並轉發消息。您可以將其視爲郵局:將要發佈的郵件放在郵箱中時,可以確保郵件代理人最終發給收件人。以此類推,RabbitMQ是一個郵箱,一個郵局和一個郵遞員。
RabbitMQ與郵局之間的主要區別在於,它不處理紙張,而是接收,存儲和轉發數據消息的二進制中轉站
在下圖中,“ P”是我們的生產者,“ C”是我們的消費者。中間的框是一個隊列-RabbitMQ代表使用者保留的消息緩衝區。
簡單隊列,是RabbitMQ中最簡單的一種工作隊列模式,也叫點對點模式。它有三個角色,一個生產者,一個隊列,一個消費者。理解起來也比較簡單!由於是一對一的工作模式,它的缺點也很明顯,如果在實際的應用中,業務處理比較耗費時間,那麼單隊列模式很難在併發環境下支撐。
一、引入RabbitMQ開發包
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.6</version>
</dependency>
二、連接工具
package com.example.demo.util;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 消息隊列連接工具
*
*/
public class MQConnectionUtils {
public static Connection connection() throws IOException, TimeoutException{
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
return factory.newConnection();
}
}
三、生產者
package com.example.demo.produce;
import com.example.demo.util.MQConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 簡單模式 - 生產者
*
*/
public class SimpleProduce {
private static final String SIMPLE_QUEUE_NAME = "simple_queue_name";
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = MQConnectionUtils.connection();
Channel channel = connection.createChannel();
// 聲明一個隊列
channel.queueDeclare(SIMPLE_QUEUE_NAME, false,false,false,null);
String msg = "hello,我是簡單模式-生產者!";
channel.basicPublish("", SIMPLE_QUEUE_NAME, null, msg.getBytes());
channel.close();
connection.close();
}
}
四、消費者
package com.example.demo.consume;
import com.example.demo.common.Constant;
import com.example.demo.util.MQConnectionUtils;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 簡單模式 - 消費者
*/
public class SimpleConsume {
private static final String SIMPLE_QUEUE_NAME = "simple_queue_name";
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = MQConnectionUtils.connection();
Channel channel = connection.createChannel();
channel.queueDeclare(SIMPLE_QUEUE_NAME,false,false, false,null);
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumeTag, Envelope envelope, AMQP.BasicProperties basicProperties, byte[] body)
throws IOException{
String msg = new String(body, "utf-8");
System.out.println("收到的消息爲:<" + msg + ">");
}
};
channel.basicConsume(SIMPLE_QUEUE_NAME,true,consumer);
}
}
五、啓動服務