rabbitmq主題訂閱
一、topic 模式交換機
上一篇文章講述了關於直接連接交換機根據key找到對應隊列的方式,實現特殊消息特殊隊列消費的目的,但是事實上,生產環境下,對於消息的複雜性遠不是這樣就能夠解決的!比如:你要監控有個用戶的操作行爲,用戶的操作行爲太多了 增刪改查,如果一個一個的寫難免會有遺漏,這個時候,我們可以用通配符 user.* 輕鬆解決!這就是mq的主題模式!
這裏的交換機類型爲 topic 模式的,他更像direct模式,只不過direct是單個匹配,而topic是通配符匹配
*
:代表一個字符#
:代表多個字符
他的用法極其類似於direct 模式,我們不多說了,直接看代碼
二、主要代碼
消息生產者
:消息生產者,在發送消息的時候需要指定消息類型
String msg = "醉臥沙場君莫笑";
//關注第二個參數
channel.basicPublish(EXCHANGE_NAME,"huangfu.del",null,msg.getBytes());
消息消費者
:消息消費者,在綁定交換機的時候需要指定通配符
//綁定交換機
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"huangfu.#");
三、詳細代碼
消息生產者
package com.topics;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.util.MqConnection;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 發佈訂閱模式
* 主題模式
* @author huangfu
*/
public class TopicsSend {
private static String EXCHANGE_NAME = "topic";
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = MqConnection.getConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME,"topic");
String msg = "醉臥沙場君莫笑";
channel.basicPublish(EXCHANGE_NAME,"huangfu.del",null,msg.getBytes());
System.out.println("send:"+msg);
channel.close();
connection.close();
}
}
消費者1
package com.topics;
import com.rabbitmq.client.*;
import com.util.MqConnection;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author Administrator
*/
public class TopicsRecv {
private static String QUEUE_NAME = "topics";
private static String EXCHANGE_NAME = "topic";
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = MqConnection.getConnection();
final Channel channel = connection.createChannel();
//聲明對壘
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//綁定交換機
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"huangfu.add");
channel.basicQos(1);
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println(new String(body,"UTF-8"));
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
channel.basicConsume(QUEUE_NAME,false,consumer);
}
}
消費者2
package com.topics;
import com.rabbitmq.client.*;
import com.util.MqConnection;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author Administrator
*/
public class TopicsRecv2 {
private static String QUEUE_NAME = "topics2";
private static String EXCHANGE_NAME = "topic";
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = MqConnection.getConnection();
final Channel channel = connection.createChannel();
//聲明對壘
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//綁定交換機
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"huangfu.#");
channel.basicQos(1);
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println(new String(body,"UTF-8"));
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
channel.basicConsume(QUEUE_NAME,false,consumer);
}
}