RabbitMq--基础原理

一、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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值