路由模式
路由模式是可以根据路由键
选择性给多个消费者发送消息的模式,它包含一个生产者、两个消费者、两个队列和一个交换机。两个消费者同时绑定到不同的队列上去,两个队列通过路由键
绑定到交换机上去,生产者发送消息到交换机,交换机通过路由键
转发到不同队列,队列绑定的消费者接收并消费消息。
生产者
/**
* Created by wzy on 2020/12/7
* 消息发送者
*/
public class RouteSender {
private final static String EXCHANGE_NAME = "myRoute";
private final static String ROUTE_KEY = "key2";
private final static String EXCHANGE_TYPE = "direct";
public static void main (String[] arsg) throws Exception{
//获取连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
Channel channel =connection.createChannel();
//声明交换机
channel.exchangeDeclare(EXCHANGE_NAME,EXCHANGE_TYPE);//direct路由模式
//发送内容
channel.basicPublish(EXCHANGE_NAME,ROUTE_KEY,null,("发送"+ROUTE_KEY+"消息").getBytes());
//关闭连接
channel.close();
connection.close();
}
}
消费者1
/**
* Created by wzy on 2020/12/7
* 消息接收者1
*/
public class RouteRecver1 {
private final static String QUEUE = "routequeue1";
private final static String EXCHANGE_NAME = "myRoute";
public static void main (String[] arsg) throws Exception{
//获取连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
Channel channel =connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE,false,false,false,null);
channel.basicQos(1);//执行的快就多干,执行的慢就少干
//将交换器与队列绑定
channel.queueBind(QUEUE,EXCHANGE_NAME,"key1");
channel.queueBind(QUEUE,EXCHANGE_NAME,"key3");
//定义接收者
boolean autoAck = false;
channel.basicConsume(QUEUE, autoAck, "myConsumerTag",
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.err.println("1body: " + new String(body));
//确认,false为确认收到消息,true为拒绝收到消息
channel.basicAck(envelope.getDeliveryTag(),false);
}
});
}
}
消费者2
/**
* Created by wzy on 2020/12/7
* 消息接收者2
*/
public class RouteRecver2 {
private final static String QUEUE = "routequeue2";
private final static String EXCHANGE_NAME = "myRoute";
public static void main (String[] arsg) throws Exception{
//获取连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
Channel channel =connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE,false,false,false,null);
channel.basicQos(1);//执行的快就多干,执行的慢就少干
//将交换器与队列绑定
channel.queueBind(QUEUE,EXCHANGE_NAME,"key1");
channel.queueBind(QUEUE,EXCHANGE_NAME,"key2");
//定义接收者
boolean autoAck = false;
channel.basicConsume(QUEUE, autoAck, "myConsumerTag",
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.err.println("2body: " + new String(body));
//确认,false为确认收到消息,true为拒绝收到消息
channel.basicAck(envelope.getDeliveryTag(),false);
}
});
}
}
运行生产者后,消费者1和 消费者2都收到消息
修改路由key为了key2后,重新运行生产者后,只有消费者2收到消息