一,名詞介紹
- Server:又稱 Broker,接受客戶端的連接,實現AMQP實體服務。
- Connection:連接,應用程序與 Broker的網絡連接。
- Channel:網絡信道,幾乎所有的操作都在 Channel中進行, Channel是進行消息讀寫的通道。客戶端可建立多個 hannel,每個 Channel代表一個會話任務。
- Message:消息,服務器和應用程序之間傳送的數據,由 Properties和Body組成。 Properties可以對消息進行修飾,比如消息的優先級、延遲等高級特性;Body則就是消息體內容。
- Virtual host:虛擬地址,用於進行邏輯隔離,最上層的消息路由。個 /irtual Host裏面可以有若千個 Exchange和 Queue,同一個 VirtualHost裏面不能有相同名稱的 Exchange或 Queue。
- Exchange:交換機,接收消息,根據路由鍵轉發消息到綁定的隊列。
- Binding: Exchange和 Queue?之間的虛擬連接, binding中可以包含 routing key
- Routing key:一個路由規則,虛擬機可用它來確定如何路由一個特定消息
- Queue:也稱爲 Message Queue,消息隊列,保存消息並將它們轉發給消費
二,hello world,簡單隊列
/**
* @Description:rabbitmq獲取連接類
*/
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* @ClassName: ConnectUtil
* @Description: rabbitmq獲取連接工廠類
*/
public class ConnectUtil {
/**
* @throws TimeoutException
* @throws IOException
* @Title: getRMQconnect
* @Description: 獲取mq連接
* @return Connection 返回類型
* @throws
*/
public static Connection getRMQconnect() throws IOException, TimeoutException{
//定義連接工廠
ConnectionFactory connectionFactory = new ConnectionFactory();
//定義連接地址
connectionFactory.setHost("192.168.1.123");
//定義連接端口 AMQP協議 5672端口
connectionFactory.setPort(5672);
//定義連接的virtualhost
connectionFactory.setVirtualHost("/vh_sxrmq");
//用戶名
connectionFactory.setUsername("sx_rmq");
//密碼
connectionFactory.setPassword("123456");
return connectionFactory.newConnection();
}
}
/**
* @Title: Constants.java
*/
/**
* @Description: 定義通用的常量名稱
*/
public final class Constants {
//定義簡單隊列名稱
public final static String SIMPLE_QUEUE_NAME = "SIMPLE_QUEUE_NAME";
//定義work queue隊列名稱
public final static String WORK_QUEUE_NAME = "WORK_QUEUE_NAME";
}
/**
* @Title: Send.java
*/
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.suxu.rmq.common.Constants;
import com.suxu.rmq.util.ConnectUtil;
/**
* @ClassName: Send
* @Description: 消息生產者
*/
public class Send {
/**
* @throws TimeoutException
* @throws IOException
* @Title: main
* @Description: 發送消息
* @param args
* @return void 返回類型
* @throws
*/
public static void main(String[] args) throws IOException, TimeoutException {
Connection conn = ConnectUtil.getRMQconnect();
Channel channel = conn.createChannel();
channel.queueDeclare(Constants.SIMPLE_QUEUE_NAME, false, false, false, null);
String msg = "hello world!";
channel.basicPublish("", Constants.SIMPLE_QUEUE_NAME, null, msg.getBytes());
System.out.println(Constants.SIMPLE_QUEUE_NAME+" send: "+msg);
channel.close();
conn.close();
}
}
/**
* @Title: Recv.java
*/
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.suxu.rmq.common.Constants;
import com.suxu.rmq.util.ConnectUtil;
/**
* @ClassName: Recv
* @Description: 消息消費者
*/
public class Recv {
/**
* @throws InterruptedException
* @throws ConsumerCancelledException
* @throws ShutdownSignalException
* @throws TimeoutException
* @throws IOException
* @Title: main
* @Description: 消費消息
* @param args
* @return void 返回類型
* @throws
*/
public static void main(String[] args) throws IOException, TimeoutException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
Connection conn = ConnectUtil.getRMQconnect();
Channel channel = conn.createChannel();
channel.queueDeclare(Constants.SIMPLE_QUEUE_NAME, false, false, false, null);
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
BasicProperties properties, byte[] body) throws IOException {
// TODO Auto-generated method stub
super.handleDelivery(consumerTag, envelope, properties, body);
String msg = new String(body,"utf-8");
System.out.println(Constants.SIMPLE_QUEUE_NAME + " new api recv: "+msg);
}
};
channel.basicConsume(Constants.SIMPLE_QUEUE_NAME, true, consumer);
}
}
簡單隊列不足:耦合性高,生產者和消費者一對一