一、RabbitMq的主要组件
1、Exchange
exchage(交换机):
type:direct(默认),fanout,topic,header
durable:是否开启持久化exchange
autoDelete: 当已经没有消费者时,服务器是否可以删除该exchange
direct:
direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。
fanout:
fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。
topic:
与direct类型的Exchange类似,也是把消息路由到那些binding key与routing key完全匹配的Queue中,
但又扩展了一些约定:
1)、routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
2)、binding key与routing key一样也是句点号“. ”分隔的字符串
3)、binding key中可以存在两种特殊字符星号与“#”,用于做模糊匹配,其中星号用于匹配一个单词,“#”用于匹配多个单词(注意:可以是零个)
2、Queue(队列)
就是消息的暂存区/存储区
二、Ack(消息确认机制)
在 RabbitMQ 中,消息确认处理机制有三种:Auto - 自动确认、Manual - 手动确认、None - 无需确认,而确认机制需要 listener implements ChannelAwareMessageListener 接口,并重写其中的确认消费逻辑。
1、手动确认
channel.basicAck()
参数解析
deliveryTag:该消息的index
multiple:是否批量处理.true:将一次性ack所有小于deliveryTag的消息。
channel.basicReject
参数解析
deliveryTag:该消息的index
requeue:被拒绝的是否重新入队列
/**
* Created by yan on 2019/3/14.
*
* Consumer的Listener监听类
*/
@Component
public class RabbitMqListener implements ChannelAwareMessageListener {
@Override
public void onMessage(Message message, Channel channel) throws Exception {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
byte[] body = message.getBody();
//将消费的参数转换为业务需要的类型
//TODO:调用service,编写业务逻辑方法
channel.basicAck(deliveryTag,true);
}catch (Exception e){
channel.basicReject(deliveryTag,false);
}
}
}