1. 程式人生 > >JAVA-RabbitMQ使用示例

JAVA-RabbitMQ使用示例

準備工作

匯入相關的jar包,一般maven依賴的話只要在pom檔案當中加入下面座標就好。 <dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>4.0.0</version>
</dependency>

HelloWorld示例

生產者
package com.xh.rabbitmq;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer {
	public static void main(String[] args) throws IOException, TimeoutException {	
		//例項化工廠
		ConnectionFactory factory = new ConnectionFactory();
		//設定相關引數,地址,埠,賬號,密碼
		factory.setHost("localhost");
		factory.setPort(5672);
		factory.setUsername("guest");
		factory.setPassword("guest");
		//獲取connection
		Connection conn = factory.newConnection();
		//獲取channel
		Channel channel = conn.createChannel();
		//建立佇列		1-佇列名稱	2-佇列是否持久化	3-是否是排他佇列	4-使用完之後是否刪除此佇列	5-其他屬性
		channel.queueDeclare("hello", false, false, false, null);
		//建立路由		1-路由名稱	2-路由型別
		channel.exchangeDeclare("myexchange", "topic");
		//繫結路由佇列	1-佇列名稱	2-路由名稱	3-routing key		
		channel.queueBind("hello", "myexchange", "shensha");
		//傳送訊息		1-路由名稱	2-routing key	3-其他資訊	4-訊息位元組陣列
		channel.basicPublish("myexchange", "shensha", null, "HelloWorld".getBytes());
		//關閉資源
		channel.close();
		conn.close();
	}
}
生產者在傳送訊息的時候,相關引數還可以設定更多.具體引數值根據實際開發環境輸入.每次傳送訊息的時候都需要建立socket連線,這是需要昂貴的代價的.建議使用連線池來實現獲取連線,使用 apache的commons-pool2來實現.傳送完畢之後記得關閉資源連線. 消費者
package com.xh.rabbitmq;

import java.io.IOException;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class Consumer {
	public static void main(String[] args) {
		// 例項化工廠
		ConnectionFactory factory = new ConnectionFactory();
		// 設定相關引數,地址,埠,賬號,密碼
		factory.setHost("localhost");
		factory.setPort(5672);
		factory.setUsername("guest");
		factory.setPassword("guest");
		try {
			// 獲取connection
			Connection conn = factory.newConnection();
			// 獲取channel
			Channel channel = conn.createChannel();
			// 建立佇列 1-佇列名稱 2-佇列是否持久化 3-是否是排他佇列 4-使用完之後是否刪除此佇列 5-其他屬性
			channel.queueDeclare("hello", false, false, false, null);
			//消費訊息.	1-消費佇列	2-是否自動傳送訊息回執	3-回撥函式
			channel.basicConsume("hello", true, new DefaultConsumer(channel){
				
				@Override
				public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
						throws IOException {
					String message = new String(body, "UTF-8");
					System.out.println("接收到的訊息為: " + message);
				}
				
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

消費者在消費的時候,也需要嘗試建立佇列.因為如果消費者消費的佇列不存在的話,會出現異常情況.如果消費者建立的佇列已經存在的話,RabbitMQ不會做任何事情.在進行消費的時候,需要設定自動傳送回執ACK給服務端,當服務端接收到這個回執之後,確認消費者已經成功消費該訊息時,RabbitMQ會從訊息隊列當中刪除該訊息. 回撥函式,是重寫的介面當中的方法,進行接收訊息,以便做進一步的處理. 消費者不用關閉資源連線,因為它要一直監聽佇列,當隊列當中有訊息進來的時候,會消費該訊息. 執行該示例,生產者控制檯為:
消費者控制檯為:
以上是JAVA簡單的RabbitMQ示例.