@@ -723,38 +723,39 @@ ensure_ttl_timer(State = #q{backing_queue = BQ,
723723ensure_ttl_timer (State ) ->
724724 State .
725725
726+ ack_if_no_dlx (AckTags , State = # q {dlx = undefined ,
727+ backing_queue = BQ ,
728+ backing_queue_state = BQS }) ->
729+ {_Guids , BQS1 } = BQ :ack (AckTags , BQS ),
730+ State # q {backing_queue_state = BQS1 };
731+ ack_if_no_dlx (_AckTags , State ) ->
732+ State .
733+
726734dead_letter_fun (_Reason , # q {dlx = undefined }) ->
727735 undefined ;
728736dead_letter_fun (Reason , _State ) ->
729737 fun (Msg , AckTag ) ->
730738 gen_server2 :cast (self (), {dead_letter , {Msg , AckTag }, Reason })
731739 end .
732740
733- dead_letter_msg (Msg , AckTag , Reason , State = # q {dlx = DLX }) ->
734- case rabbit_exchange :lookup (DLX ) of
735- {error , not_found } -> noreply (State );
736- _ -> dead_letter_msg_existing_dlx (Msg , AckTag , Reason ,
737- State )
741+ dead_letter_publish (Msg , Reason , State = # q {publish_seqno = MsgSeqNo }) ->
742+ DLMsg = # basic_message {exchange_name = XName } =
743+ make_dead_letter_msg (Reason , Msg , State ),
744+ case rabbit_exchange :lookup (XName ) of
745+ {ok , X } ->
746+ Delivery = rabbit_basic :delivery (false , false , DLMsg , MsgSeqNo ),
747+ {Queues , Cycles } = detect_dead_letter_cycles (
748+ DLMsg , rabbit_exchange :route (X , Delivery )),
749+ lists :foreach (fun log_cycle_once /1 , Cycles ),
750+ QPids = rabbit_amqqueue :lookup (Queues ),
751+ {_ , DeliveredQPids } = rabbit_amqqueue :deliver (QPids , Delivery ),
752+ DeliveredQPids ;
753+ {error , not_found } ->
754+ []
738755 end .
739756
740- dead_letter_publish (Msg , Reason ,
741- State = # q {publish_seqno = MsgSeqNo ,
742- dlx = DLX }) ->
743- Delivery = # delivery {message = # basic_message {exchange_name = XName }} =
744- rabbit_basic :delivery (
745- false , false , make_dead_letter_msg (DLX , Reason , Msg , State ),
746- MsgSeqNo ),
747- {ok , X } = rabbit_exchange :lookup (XName ),
748- Queues = rabbit_exchange :route (X , Delivery ),
749- {Queues1 , Cycles } = detect_dead_letter_cycles (Delivery , Queues ),
750- lists :foreach (fun log_cycle_once /1 , Cycles ),
751- QPids = rabbit_amqqueue :lookup (Queues1 ),
752- {_ , DeliveredQPids } = rabbit_amqqueue :deliver (QPids , Delivery ),
753- DeliveredQPids .
754-
755- dead_letter_msg_existing_dlx (Msg , AckTag , Reason ,
756- State = # q {publish_seqno = MsgSeqNo ,
757- unconfirmed = UC }) ->
757+ dead_letter_msg (Msg , AckTag , Reason , State = # q {publish_seqno = MsgSeqNo ,
758+ unconfirmed = UC }) ->
758759 QPids = dead_letter_publish (Msg , Reason , State ),
759760 State1 = State # q {queue_monitors = pmon :monitor_all (
760761 QPids , State # q .queue_monitors ),
@@ -813,8 +814,7 @@ cleanup_after_confirm(AckTags, State = #q{delayed_stop = DS,
813814 false -> noreply (State1 )
814815 end .
815816
816- detect_dead_letter_cycles (# delivery {message = # basic_message {content = Content }},
817- Queues ) ->
817+ detect_dead_letter_cycles (# basic_message {content = Content }, Queues ) ->
818818 # content {properties = # 'P_basic' {headers = Headers }} =
819819 rabbit_binary_parser :ensure_content_decoded (Content ),
820820 NoCycles = {Queues , []},
@@ -841,31 +841,31 @@ detect_dead_letter_cycles(#delivery{message = #basic_message{content = Content}}
841841 end
842842 end .
843843
844- make_dead_letter_msg (DLX , Reason ,
844+ make_dead_letter_msg (Reason ,
845845 Msg = # basic_message {content = Content ,
846846 exchange_name = Exchange ,
847847 routing_keys = RoutingKeys },
848- State = # q {dlx_routing_key = DlxRoutingKey }) ->
848+ State = # q {dlx = DLX , dlx_routing_key = DlxRoutingKey }) ->
849849 {DeathRoutingKeys , HeadersFun1 } =
850850 case DlxRoutingKey of
851851 undefined -> {RoutingKeys , fun (H ) -> H end };
852852 _ -> {[DlxRoutingKey ],
853853 fun (H ) -> lists :keydelete (<<" CC" >>, 1 , H ) end }
854854 end ,
855+ ReasonBin = list_to_binary (atom_to_list (Reason )),
855856 # resource {name = QName } = qname (State ),
857+ TimeSec = rabbit_misc :now_ms () div 1000 ,
856858 HeadersFun2 =
857859 fun (Headers ) ->
858860 % % The first routing key is the one specified in the
859861 % % basic.publish; all others are CC or BCC keys.
860- RoutingKeys1 =
861- [hd (RoutingKeys ) | rabbit_basic :header_routes (Headers )],
862- Info = [{<<" reason" >>,
863- longstr , list_to_binary (atom_to_list (Reason ))},
864- {<<" queue" >>, longstr , QName },
865- {<<" time" >>, timestamp , rabbit_misc :now_ms () div 1000 },
866- {<<" exchange" >>, longstr , Exchange # resource .name },
867- {<<" routing-keys" >>, array ,
868- [{longstr , Key } || Key <- RoutingKeys1 ]}],
862+ RKs = [hd (RoutingKeys ) | rabbit_basic :header_routes (Headers )],
863+ RKs1 = [{longstr , Key } || Key <- RKs ],
864+ Info = [{<<" reason" >>, longstr , ReasonBin },
865+ {<<" queue" >>, longstr , QName },
866+ {<<" time" >>, timestamp , TimeSec },
867+ {<<" exchange" >>, longstr , Exchange # resource .name },
868+ {<<" routing-keys" >>, array , RKs1 }],
869869 HeadersFun1 (rabbit_basic :append_table_header (<<" x-death" >>,
870870 Info , Headers ))
871871 end ,
@@ -1240,11 +1240,13 @@ handle_cast({reject, AckTags, Requeue, ChPid}, State) ->
12401240 ChPid , AckTags , State ,
12411241 case Requeue of
12421242 true -> fun (State1 ) -> requeue_and_run (AckTags , State1 ) end ;
1243- false -> Fun = dead_letter_fun (rejected , State ),
1244- fun (State1 = # q {backing_queue = BQ ,
1243+ false -> fun (State1 = # q {backing_queue = BQ ,
12451244 backing_queue_state = BQS }) ->
1245+ Fun = dead_letter_fun (rejected , State1 ),
12461246 BQS1 = BQ :fold (Fun , BQS , AckTags ),
1247- State1 # q {backing_queue_state = BQS1 }
1247+ ack_if_no_dlx (
1248+ AckTags ,
1249+ State1 # q {backing_queue_state = BQS1 })
12481250 end
12491251 end ));
12501252
0 commit comments