- Routing(路由模式):
代码实践
public class Produce_RoutingKey {
private static final String QUEUE_SMS = "queue_inform_sms"; //短信队列名
private static final String QUEUE_EMAIL = "queue_inform_email"; //邮件队列名
private static final String ROUTINGKEY_SMS = "routingkey_sms"; //短信队列key
private static final String ROUTINGKEY_EMAIL = "routingkey_email"; //邮件队列key
private static final String EXCHANGE_ROUTING_INFORM = "exchange_routing_inform"; //交换机
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_SMS,true,false,false,null); //监听QUEUE_SMS队列
channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);//监听QUEUE_EMAIL队列
channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.DIRECT); //创建交换机
channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS);//QUEUE_SMS队列与ROUTINGKEY_SMS交换机绑定
channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL);//QUEUE_EMAIL队列与ROUTINGKEY_EMAIL交换机绑定
//QUEUE_SMS QUEUE_EMAIL 绑定同一EXCHANGE_ROUTING_INFORM 同一 info_public
channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,"info_public");
channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,"info_public");
for (int i=0;i<5;i++) {
/*
String message_sms = "rabbitmq routing sms";
channel.basicPublish(EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS,null,message_sms.getBytes());
String message_email = "rabbitmq routing email";
channel.basicPublish(EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL,null,message_email.getBytes());
*/
//交换机根据info_public 转发至队列
String message = "rabbitmq routing info";
channel.basicPublish(EXCHANGE_ROUTING_INFORM,"info_public",null,message.getBytes());
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
channel.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class Consumer_RoutingKey_SMS {
private static final String QUEUE_SMS = "queue_inform_sms"; //短信队列名
private static final String ROUTINGKEY_SMS = "routingkey_sms"; //短信队列key
private static final String EXCHANGE_ROUTING_INFORM = "exchange_routing_inform"; //交换机
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_SMS,true,false,false,null);
channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.DIRECT);
channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS);
DefaultConsumer 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_SMS,true,consumer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Consumer_RoutingKey_Email {
private static final String QUEUE_EMAIL = "queue_inform_email"; //邮件队列名
private static final String ROUTINGKEY_EMAIL = "routingkey_email"; //邮件队列key
private static final String EXCHANGE_ROUTING_INFORM = "exchange_routing_inform"; //交换机
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);
channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.DIRECT);
channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL);
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_EMAIL,true,consumer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
一个交换机绑定多个队列,每个队列设置routingkey,并且每个队列可以设置多个routingkey,消费者监听自己队列,生产者将消息发送至交换机,发送的消息需要指定routingkey那么交换机就会根据routingkey的值找到队列将消息转发到队列里。
- Tocpic(通配符模式):
通配符模式和路由模式相似,只不过rotingkey的匹配方式不一样。
符号#:匹配一个或多个词,(每个词以.分割) 比如inform.#可以匹配inform.email,inform.sms.abc.haha等
符号*:只能匹配一个词,比如inform.*可以匹配inform.email,inform.sms等
代码实践:
public class Produce_Topics {
private static final String QUEUE_SMS = "queue_inform_sms"; //短信队列名
private static final String QUEUE_EMAIL = "queue_inform_email"; //邮件队列名
private static final String ROUTINGKEY_SMS = "routingkey.#.sms.#"; //统配符匹配 短信队列key
private static final String ROUTINGKEY_EMAIL = "routingkey.#.email.#"; //统配符匹配 邮件队列key
private static final String EXCHANGE_ROUTING_INFORM = "exchange_topic_inform"; //交换机
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_SMS,true,false,false,null); //监听QUEUE_SMS队列
channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);//监听QUEUE_EMAIL队列
channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.TOPIC); //创建交换机
channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS);//QUEUE_SMS队列与ROUTINGKEY_SMS交换机绑定
channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL);//QUEUE_EMAIL队列与ROUTINGKEY_EMAIL交换机绑定
for(int i=0;i<5;i++) {
String message = "rabbitmq routing email";
channel.basicPublish(EXCHANGE_ROUTING_INFORM,"routingkey.email",null,message.getBytes());
}
for(int i=0;i<5;i++) {
String message = "rabbitmq routing sms";
channel.basicPublish(EXCHANGE_ROUTING_INFORM,"routingkey.sms",null,message.getBytes());
}
for(int i=0;i<5;i++) {
String message = "rabbitmq routing info";
channel.basicPublish(EXCHANGE_ROUTING_INFORM,"routingkey.email.sms",null,message.getBytes());
}/**/
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
channel.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class Consumer_Topics_Email {
private static final String QUEUE_EMAIL = "queue_inform_email"; //邮件队列名
private static final String ROUTINGKEY_EMAIL = "routingkey.#.email.#"; //统配符匹配 邮件队列key
private static final String EXCHANGE_ROUTING_INFORM = "exchange_topic_inform"; //交换机
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_EMAIL,true,false,false,null);
channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.TOPIC);
channel.queueBind(QUEUE_EMAIL,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_EMAIL);
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_EMAIL,true, consumer);
}catch (Exception e) {
e.printStackTrace();
}
}
}
public class Consumer_Topics_SMS {
private static final String QUEUE_SMS = "queue_inform_sms"; //短信队列名
private static final String ROUTINGKEY_SMS = "routingkey.#.sms.#"; //统配符匹配 短信队列key
private static final String EXCHANGE_ROUTING_INFORM = "exchange_topic_inform"; //交换机
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_SMS,true,false,false,null);
channel.exchangeDeclare(EXCHANGE_ROUTING_INFORM, BuiltinExchangeType.TOPIC);
channel.queueBind(QUEUE_SMS,EXCHANGE_ROUTING_INFORM,ROUTINGKEY_SMS);
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_SMS,true, consumer);
}catch (Exception e) {
e.printStackTrace();
}
}
}
- Header(模式):
Header取消使用rotingkey,使用header中的键值对(K/V)进行匹配。