上一篇是一个简单的helloworld。
我们直接发直接收 这种是最简单的。
下面我们再来接触更加复杂一点:
简单工作模式
- work queues 工作队列模式:
这里注意 这里的消息 对两个消费者 c1 c2来说是竞争关系 而不是等份分发关系, 就像两个线程争抢一个资源一样,最后只有一个能获取到。
pub/sub 订阅模式
这个模式很有意思:
注意最后一句话,exchange 只负责转发消息 不具备存储消息的能力。
这里的pub/sub 我们通常叫他广播模式,它是需要声明交换机的,看上面那个简单工作模式 它为什么没有声明交换机(注意是声明 就是说有一个默认的交换机 直接用 不用自己指定)? 因为他只有一个队列。
在广播模式里面 交换机会把信息 给每一个队列都发一份。人人平等 人人有份。 所以如果有10个消费者和队列 每个监听一个队列 ,那么广播模式一下 就是发一收10。很好理解对吧。
我们复制2个消费者来试一下:
首先看生产者
我们首先要创建交换机 这些参数要知道一下:
/**
* exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)
* exchange 交换机名称
* type 交互及类型(四种) 广播 定向 通配符 参数
* durable 持久化
* autoDelete 自动删除
* internal 内部使用
* arguments 参数
* */
String exchangeName = "test_fanout";
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true,false,false,null);
然后创建2个队列 绑定给交换机 然后发送
String queue1Name = "test_fanout_queue1";
String queue2Name = "test_fanout_queue2";
channel.queueDeclare(queue1Name,true,false,false,null);
channel.queueDeclare(queue2Name,true,false,false,null);
/**
* 队列名称
* 交换机名称
* 绑定规则 (注意如果是广播,绑定规则则是空)
* */
//绑定队列和交换机
channel.queueBind(queue1Name,exchangeName,"");
channel.queueBind(queue2Name,exchangeName,"");
//发送消息
String body = "Z是最imba的种族 人族打不了";
channel.basicPublish(exchangeName,"",null,body.getBytes());
channel.close();
con.close();
(注意如果是广播,绑定规则则是空)为什么是空? 因为它要给每一个队列都发 人人有份 你绑定规则没意义。
而在消费者中:
/**
* basicConsume(String queue, boolean autoAck, Consumer callback)
* queue 队列名称
* autoAck 是否自动确认 消费者收到之后自动给mq说一声 我收到了 作为确认
* callback 回调对象 它会监听一些方法
* */
channel.basicConsume(queue1Name,true,consumer);
我们只需要改这个队列名称就可以了,
改成test_fanout_queue1/test_fanout_queue2
运行一下:
tag标识:amq.ctag-fkvUaIJQJebfndEHNYd9sg
交换机:test_fanout 路由key
数据:P是最imba的种族 人族没法打
tag标识:amq.ctag-fkvUaIJQJebfndEHNYd9sg
交换机:test_fanout 路由key
数据:Z是最imba的种族 人族打不了
Process finished with exit code 130
两个队列打出来的是一样的