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

也能夠經過命令行查看上述信息:

相關文章
相關標籤/搜索