rabbitmq7-topic模式
2018-09-11 本文已影响0人
fkxuexi
一、简介
如果你对rabbitmq6-direct路由模式比较熟悉的话,把这个简介看完然后跳过,如果不熟的话,就把下面的代码看一看,有兴趣的敲一敲就可以了。本来不想写这一节的,但是为了体系的完整性,所以还是把这一节给补出来。
在rabbitmq2-这可能是rabbitmq最全的概览中,我们提到过topic和direct的区别,没有什么大的区别,就是binding key和routing key的匹配方式可以通过通配符的方式,也就是说路由模式是topic模式的一个特例。如果这一节代码你copy后发现有问题,请查看上一节的内容,其中有一些注意事项。talk is cheap ,show me the code,不多比比,下面把代码呈上来。
二、代码:
2.1 producer
public class Producer {
public static final String EXCHANGE_NAME = "topic_exchange";
public static final String ROUTING_KEY1 = "topic.key1";
public static final String ROUTING_KEY2 = "topic.key2";
public static void main(String[] args) throws IOException, TimeoutException {
Connection conn = ConnUtils.getConn();
Channel channel = conn.createChannel();
/**
* 注意下面我们持久化的是交换机,已经不是持久化的队列了,交换机是不存放消息的,只是一个消息的搬运工
*/
String exchangeType = BuiltinExchangeType.TOPIC.getType();
boolean durable = true;
boolean autoDelete = false;
boolean internal = false;
Map<String,Object> arguments = null;
// 声明一个交换机
channel.exchangeDeclare(EXCHANGE_NAME, exchangeType,durable,autoDelete,internal,arguments);
channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY1,null,"CEUIXCXI routing key1".getBytes());
channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY2,null,"CEUIXCXI routing key2".getBytes());
}
}
上面的代码对比起来和上一节的没有明显的不同
2.2 consumer代码:
public class Consume001 {
public static final String EXCHANGE_NAME = "topic_exchange";
public static final String QUEUE_NAME1 = "topic_queue";
public static final String ROUTING_KEY1 = "topic.*";
public static void main(String[] args) throws IOException, TimeoutException {
Connection conn = ConnUtils.getConn();
final Channel channel = conn.createChannel();
channel.queueDeclare(QUEUE_NAME1,true,false,false,null);
channel.queueBind(QUEUE_NAME1,EXCHANGE_NAME,ROUTING_KEY1);
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_NAME1,false,consumer);
}
}
2.3、执行结果
image.pngimage.png
ps:这个系列里面还有一个rpc,但是我也不打算写了,毕竟专门的人干专门的事儿,框架也是一样的。同时学习的时候我们也是采用2和8的原则的,学20%的东西干80%的事儿,有时间的情况下我们再去慢慢的研究。