连接服务端需要 指定
1 IP地址 2 端口号 3 用户名 4 密码
即可连接
线程间channel不可共享 会出现线程安全问题
使用channel时 如果其已经关闭 会抛出 异常
客户端catch此异常即可
并同时捕获 IO 以及 Socket异常 防止Connection意外关闭
通过channel声明交换机以及队列
声明交换机传入的 参数:
1交换机名称
2交换机类型
3是否持久化
4是否设置自动删除:当无队列与此交换机绑定时会自动删除此交换机
5是否为内置交换机:为内置交换机 只能通过交换机路由到此交换机 而不能直接发送消息到此交换机
6 其他结构化参数
声明队列
1 队列名称
2 是否持久化
3 是否排他 同一名称的队列只能被一个connection所拥有
4 是否自动删除 所有与这个队列相连接的消费者均断开连接
将交换机与队列进行绑定:
1 队列名称
2 交换机名称
3 绑定队列和交换机的路由键 RoutingKey
4 绑定的一些参数
将交换机与交换机进行绑定:
生产者将消息发送到交换机source中,交换机source根据路由键找到与其匹配的另一个交换机,由该交换机路由到其绑定的队列中。
何时创建队列:
在上线前评估好流量,预测出需要使用的队列的情况。
发送消息:
投递模式设置为2:消息持久化到硬盘中
headers
过期时间
交换机名称
消费消息:
消费模式分两种:
1 推模式 采用Basic.Consume 进行消费
2 拉模式 调用Basic.Get 进行消费
推模式:采用持续订阅的方式来消费消息,接受消息通过实现Consumer接口或者继承DefaultConsumer类来实现
注意点:
自动ack设置为false,在消息消费完成后调用ack。以防止消息丢失问题
basicConsume中的参数:
1 队列名称
2 是否自动ack
3 消费者标签,用于区分多个消费者
4 noLocal 为true表示不能将生产消费消息都在同一台机器上
5 是否排他
6 消费者的回调函数,用于消费消息。如实现接口,或继承类后实现的方法。
7 其他参数
拉模式:不建议使用,使用推模式对MQ的吞吐量更友好
消费者端的确认与拒绝
MQ需要收到消费者ack信号后才把对应信号打上删除标记,之后进行删除(定时任务惰性删除?)
MQ队列中的消息分为两部分:
1 等待投递的消息
2 已经投递给消费者的消息,但未收到消费者ack的消息
如MQ未收到消费者ack信号,且消费者已经断开连接->MQ会安排该消息重新进入队列,重新走投递流程
如消费者拒绝消息
且requeue为true,则该消息重新入队
如requeue为false,则该消息会从队列中移除
Basic.Reject 一次拒绝一条消息
Basic.Nack 可以批量拒绝消息
上述两种拒绝方法中的requeue设置为false时,会启用死信队列功能