隊列式:一條消息只能被一個消費者消費(發佈者、消費者)
主題式:一條消息可以被每一個消費者消費(發佈者、訂閱者)
1.隊列式
一個消費者消費一個隊列的消息
兩個(或多個)消費者消費一個隊列的消息(每條消息只能被消費一次)
1.1 消息發送
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 生產者
*/
public class ComProducer {
public static String QUEUE_NAME = "aque";
public static String EXCHANGE_NAME = "aexc";
public static String ROUTING_KEY = "aaa";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory cf = new ConnectionFactory();
cf.setHost("127.0.0.1");
cf.setPort(5672);
cf.setUsername("guest");
cf.setPassword("guest");
//建立連接
Connection conn = cf.newConnection();
//創建消息通道
Channel channel = conn.createChannel();
//消息內容
String msg = " hello world! ";
//創建 隊列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//創建路由
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//綁定路由與隊列
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
//發送消息
for (byte i = 0; i < 10; i++) {
String m = i+msg;
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY , null, m.getBytes());
}
channel.close();
conn.close();
}
}
1.2 消息接收
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;
/**
* 消費者
*/
public class ComConsumer {
public static void main(String[] args) throws IOException, TimeoutException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
ConnectionFactory cf = new ConnectionFactory();
cf.setHost("127.0.0.1");
cf.setPort(5672);
cf.setUsername("guest");
cf.setPassword("guest");
//建立連接
Connection conn = cf.newConnection();
//創建消息通道
Channel channel = conn.createChannel();
//創建消費者,並接受消息
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("接收消息:"+msg);
}
};
channel.basicConsume(ComProducer.QUEUE_NAME, true, consumer);
}
}
2.主題式
消息發送到轉發器,然後轉發到每個消費者的隊列(一條消息被每一個訂閱者消費)
2.1 發佈消息
ROUTING_KEY = "topic_key.aaa"
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.google.common.base.Strings;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 發佈者
*/
public class ComPublisher {
public static String EXCHANGE_NAME = "topic_exc";
public static String ROUTING_KEY = "topic_key.aaa";
public static void main(String[] args) throws IOException, TimeoutException {
//創建連接連接到MabbitMQ
ConnectionFactory factory = new ConnectionFactory();
// 設置MabbitMQ所在主機ip或者主機名
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
// 創建一個連接
Connection connection = factory.newConnection();
// 創建消息通道
Channel channel = connection.createChannel();
// 指定轉發——廣播
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
for(int i=0;i<10;i++){
// 發送的消息
String message =i+" Hello World!";
//參數1:exchange name
//參數2:routing key
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
}
// 關閉頻道和連接
channel.close();
connection.close();
}
}
2.2 訂閱者1
ROUTING_KEY = "topic_key.aaa";
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
* 訂閱者
*/
public class ComSubscribe {
public static void main(String[] args) throws IOException, InterruptedException, TimeoutException {
String ROUTING_KEY = "topic_key.aaa";
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
// 打開連接和創建頻道,與發送端一樣
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 聲明一個隨機隊列
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, ComPublisher.EXCHANGE_NAME, ROUTING_KEY);
// 創建隊列消費者
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( envelope.getRoutingKey() + " : " + message );
}
};
channel.basicConsume(queueName, true, consumer);
}
}
2.3 訂閱者2
ROUTING_KEY = "topic_key.*";// 或 "topic_key.#"
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
*
* @author lyb <br>
* 2018年7月13日 下午6:29:45
*/
public class ComSubscribe2 {
public static void main(String[] argv) throws IOException, InterruptedException, TimeoutException {
String ROUTING_KEY = "topic_key.*";// 或 "topic_key.#"
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
// 打開連接和創建頻道,與發送端一樣
Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();
// // 聲明一個隨機隊列
// String queueName = channel.queueDeclare().getQueue();
// 聲明隊列
String QUEUE_NAME = "topic_queque";
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
channel.queueBind(QUEUE_NAME, ComPublisher.EXCHANGE_NAME, ROUTING_KEY);
// 創建隊列消費者
final 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( envelope.getRoutingKey() + " : " + message );
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}