SSM整合rabbitMQ时报错org.springframework.beans.factory.NoSuchBeanDefinitionException,队列消息消费不掉unacked

报错的缘由是在配置spring-rabbitmq.xml文件时的connectionFactory与redis的connectionFactory的Id命名冲突redis

改好以后有报错:spring

spring报错org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xxx] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}服务器

缘由:对应要注入的实现类没有 加注解,如dao层 @Repository 如service层 @Service
解决:在相应的实现类加上注解便可
将MQProducer接口和MQProducerImpl放在Service层,而且加上@Service注解便可
 
 
另外,由于代码的问题,加到队列中的消息,一直没有消费掉,而后每次运行程序的时候,都是自动就跑到消费者队列中,进行消费(即进行商品的秒杀),可是这并非我想要的,想要的是秒杀的时候才进入队列
查看http://localhost:15672/#/queues的时候看到,运行的时候

业务执行失败的场景,这条消息不会ack,在Queues中一直处于Unacked状态,直到我关闭控制台程序,它才会自动将全部的Unacked的消息所有切换成Ready(虽然不知道它是怎么实现的),从而保证,下一次重启消费端时可继续尝试消费那些"失败"的消息。ui

当关闭掉IDEA以后,真的就自动的从unacked状态切换到ready状态了,很神奇。this

RabbitMQ消息确认机制

为了保证消息从队列可靠地到达消费者,RabbitMQ提供消息确认机制(message acknowledgment)。消费者在声明队列时,能够指定noAck参数,当noAck=false时,RabbitMQ会等待消费者显式发回ack信号后才从内存(和磁盘,若是是持久化消息的话)中移去消息。不然,RabbitMQ会在队列中消息被消费后当即删除它。spa

采用消息确认机制后,只要令noAck=false,消费者就有足够的时间处理消息(任务),不用担忧处理消息过程当中消费者进程挂掉后消息丢失的问题,由于RabbitMQ会一直持有消息直到消费者显式调用basicAck为止。命令行

当noAck=false时,对于RabbitMQ服务器端而言,队列中的消息分红了两部分:一部分是等待投递给消费者的消息;一部分是已经投递给消费者,可是尚未收到消费者ack信号的消息。若是服务器端一直没有收到消费者的ack信号,而且消费此消息的消费者已经断开链接,则服务器端会安排该消息从新进入队列,等待投递给下一个消费者(也可能仍是原来的那个消费者)。设计

RabbitMQ不会为未ack的消息设置超时时间,它判断此消息是否须要从新投递给消费者的惟一依据是消费该消息的消费者链接是否已经断开。这么设计的缘由是RabbitMQ容许消费者消费一条消息的时间能够好久好久。xml

RabbitMQ管理平台界面上能够看到当前队列中Ready状态和Unacknowledged状态的消息数,分别对应上文中的等待投递给消费者的消息数和已经投递给消费者可是未收到ack信号的消息数。blog

也能够经过命令行查看上述信息:

相关文章
相关标签/搜索