@@ -74,32 +74,49 @@ connect_source(State = #{name := Name,
7474 ack_mode := AckMode ,
7575 source := #{uris := [Uri | _ ],
7676 source_address := Addr } = Src }) ->
77- SndSettleMode = case AckMode of
77+ SettleMode = case AckMode of
7878 no_ack -> settled ;
7979 on_publish -> unsettled ;
8080 on_confirm -> unsettled
8181 end ,
82- AttachFun = fun amqp10_client :attach_receiver_link /5 ,
83- {Conn , Sess , LinkRef } = connect (Name , SndSettleMode , Uri , " receiver" , Addr , Src ,
84- AttachFun ),
82+ AttachArgs = receiver_attach_args (Name , SettleMode , Addr , Src ),
83+ {Conn , Sess , LinkRef } = connect (Uri , AttachArgs ),
8584 State #{source => Src #{current => #{conn => Conn ,
8685 session => Sess ,
8786 link => LinkRef ,
8887 uri => Uri }}}.
8988
89+ receiver_attach_args (Name , SettleMode , Addr , Src ) ->
90+ LinkName = begin
91+ LinkName0 = gen_unique_name (Name , " receiver" ),
92+ rabbit_data_coercion :to_binary (LinkName0 )
93+ end ,
94+ Durability = maps :get (durability , Src , unsettled_state ),
95+ Capabilities = maps :get (receiver_capabilities , Src , undefined ),
96+ Receiver0 = #{address => Addr , durable => Durability },
97+ Receiver = case Capabilities of
98+ undefined -> Receiver0 ;
99+ _ -> maps :put (capabilities , Capabilities , Receiver0 )
100+ end ,
101+ #{name => LinkName ,
102+ role => {receiver , Receiver , self ()},
103+ snd_settle_mode => SettleMode ,
104+ rcv_settle_mode => first ,
105+ filter => #{},
106+ properties => #{}}.
107+
90108-spec connect_dest (state ()) -> state ().
91109connect_dest (State = #{name := Name ,
92110 ack_mode := AckMode ,
93111 dest := #{uris := [Uri | _ ],
94112 target_address := Addr } = Dst }) ->
95- SndSettleMode = case AckMode of
113+ SettleMode = case AckMode of
96114 no_ack -> settled ;
97115 on_publish -> settled ;
98116 on_confirm -> unsettled
99- end ,
100- AttachFun = fun amqp10_client :attach_sender_link_sync /5 ,
101- {Conn , Sess , LinkRef } = connect (Name , SndSettleMode , Uri , " sender" , Addr , Dst ,
102- AttachFun ),
117+ end ,
118+ AttachArgs = sender_attach_args (Name , SettleMode , Addr , Dst ),
119+ {Conn , Sess , LinkRef } = connect (Uri , AttachArgs ),
103120 % % wait for link credit here as if there are messages waiting we may try
104121 % % to forward before we've received credit
105122 State #{dest => Dst #{current => #{conn => Conn ,
@@ -109,7 +126,24 @@ connect_dest(State = #{name := Name,
109126 link => LinkRef ,
110127 uri => Uri }}}.
111128
112- connect (Name , SndSettleMode , Uri , Postfix , Addr , Map , AttachFun ) ->
129+ sender_attach_args (Name , SettleMode , Addr , Src ) ->
130+ LinkName = begin
131+ LinkName0 = gen_unique_name (Name , " sender" ),
132+ rabbit_data_coercion :to_binary (LinkName0 )
133+ end ,
134+ Durability = maps :get (durability , Src , unsettled_state ),
135+ Capabilities = maps :get (sender_capabilities , Src , undefined ),
136+ Sender0 = #{address => Addr , durable => Durability },
137+ Sender = case Capabilities of
138+ undefined -> Sender0 ;
139+ _ -> maps :put (capabilities , Capabilities , Sender0 )
140+ end ,
141+ #{name => LinkName ,
142+ role => {sender , Sender },
143+ snd_settle_mode => SettleMode ,
144+ rcv_settle_mode => first }.
145+
146+ connect (Uri , AttachArgs ) ->
113147 {ok , Config0 } = amqp10_client :parse_uri (Uri ),
114148 % % As done for AMQP 0.9.1, exclude AMQP 1.0 shovel connections from maintenance mode
115149 % % to prevent crashes and errors being logged by the shovel plugin when a node gets drained.
@@ -119,16 +153,8 @@ connect(Name, SndSettleMode, Uri, Postfix, Addr, Map, AttachFun) ->
119153 {ok , Conn } = amqp10_client :open_connection (Config ),
120154 {ok , Sess } = amqp10_client :begin_session (Conn ),
121155 link (Conn ),
122- LinkName = begin
123- LinkName0 = gen_unique_name (Name , Postfix ),
124- rabbit_data_coercion :to_binary (LinkName0 )
125- end ,
126- % needs to be sync, i.e. awaits the 'attach' event as
127- % else we may try to use the link before it is ready
128- Durability = maps :get (durability , Map , unsettled_state ),
129- {ok , LinkRef } = AttachFun (Sess , LinkName , Addr ,
130- SndSettleMode ,
131- Durability ),
156+
157+ {ok , LinkRef } = amqp10_client :attach_link (Sess , AttachArgs ),
132158 {Conn , Sess , LinkRef }.
133159
134160-spec init_source (state ()) -> state ().
0 commit comments