RabbitMQ是一種訊息中介軟體,它接收和轉發訊息,可以理解為郵局。只是RabbitMQ接收,處理,轉發的是二進位制的資料,郵局處理的一般為紙。
基本概念
- Producer(生產者): 傳送訊息的程式
- Consumer(消費者):接收訊息的程式
- Queue(佇列):像郵局的信箱,在RabbitMQ內部,同一個訊息流只能存在一個Queue中,佇列只受主機記憶體,磁碟的大小限制。 生產者像Queue中傳送訊息,消費者從Queue中取出訊息
安裝
- Mac OS
brew install rabbitmq
複製程式碼
- CentOS7
cat << EOF > /etc/yum.repos.d/rabbit.repo
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/21/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
EOF
yum install rabbitmq-server
複製程式碼
Hello World
- 啟動RabbitMQ
rabbitmq-server
複製程式碼
- 新增Java依賴庫
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.2.0</version>
</dependency>
複製程式碼
- 編寫生產者
/**
* @author aihe 2018/9/6
*/
public class Producer {
private final static String QUEUE_NAME = "hello1";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
Connection connection = connectionFactory.newConnection();
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("傳送訊息:" + message);
try {
channel.close();
connection.close();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
複製程式碼
channel.queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
- queue 要宣告的佇列名稱
- durable 是否長久儲存,true的話,伺服器重啟的時候,queue仍然存在
- exclusive 是否宣告一個排他的佇列, 也就是隻有當前的channel才能監聽這個queue
- autoDelete 當伺服器不在使用這個queue的時候,自動刪除它
- arguments 其它的屬性
生產和消費訊息都是通過channel的。channel指定具體為那個queue
- 編寫消費者
/**
* @author aihe 2018/9/6
*/
public class Consumer {
private final static String QUEUE_NAME = "hello1";
public static void main(String[] args) throws IOException, TimeoutException {
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(" [*] 正在等待訊息. 退出按 CTRL+C");
com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" 接收訊息:'" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
複製程式碼
- 執行
生產者
消費者
額外
- 我們可以安裝rabbitMQ的圖形管理介面
// 檢視有哪些外掛
rabbitmq-plugins list
// 啟用管理介面
rabbitmq-plugins enable rabbitmq_management
複製程式碼
- 進入管理介面 進入地址:http://127.0.0.1:15672/ 賬號和密碼:guest guest
這些引數大部分都是可以從rabbitmqctl命令獲得的。
最後
學習下訊息中介軟體