15
15
-export ([register /0 , unregister /0 , parse /3 ]).
16
16
-export ([obfuscate_uris_in_definition /1 ]).
17
17
18
+ % % Function references should not be stored on the metadata store.
19
+ % % They are only valid for the version of the module they were created
20
+ % % from and can break with the next upgrade. It should not be used by
21
+ % % another one that the one who created it or survive a node restart.
22
+ % % Thus, function references have been replace by the following MFA.
23
+ -export ([dest_decl /4 , src_decl_exchange /4 , src_decl_queue /4 ,
24
+ fields_fun /5 , props_fun /9 ]).
25
+
18
26
-import (rabbit_misc , [pget /2 , pget /3 , pset /3 ]).
19
27
20
28
-rabbit_boot_step ({? MODULE ,
@@ -321,12 +329,7 @@ parse_amqp091_dest({VHost, Name}, ClusterName, Def, SourceHeaders) ->
321
329
DestXKey = pget (<<" dest-exchange-key" >>, Def , none ),
322
330
DestQ = pget (<<" dest-queue" >>, Def , none ),
323
331
DestQArgs = pget (<<" dest-queue-args" >>, Def , #{}),
324
- DestDeclFun = fun (Conn , _Ch ) ->
325
- case DestQ of
326
- none -> ok ;
327
- _ -> ensure_queue (Conn , DestQ , rabbit_misc :to_amqp_table (DestQArgs ))
328
- end
329
- end ,
332
+ DestDeclFun = {? MODULE , dest_decl , [DestQ , DestQArgs ]},
330
333
{X , Key } = case DestQ of
331
334
none -> {DestX , DestXKey };
332
335
_ -> {<<>>, DestQ }
@@ -335,16 +338,6 @@ parse_amqp091_dest({VHost, Name}, ClusterName, Def, SourceHeaders) ->
335
338
{<<" dest-exchange-key" >>, DestXKey },
336
339
{<<" dest-queue" >>, DestQ }],
337
340
V =/= none ],
338
- PubFun = fun (_SrcURI , _DestURI , P0 ) ->
339
- P1 = case X of
340
- none -> P0 ;
341
- _ -> P0 # 'basic.publish' {exchange = X }
342
- end ,
343
- case Key of
344
- none -> P1 ;
345
- _ -> P1 # 'basic.publish' {routing_key = Key }
346
- end
347
- end ,
348
341
AddHeadersLegacy = pget (<<" add-forward-headers" >>, Def , false ),
349
342
AddHeaders = pget (<<" dest-add-forward-headers" >>, Def , AddHeadersLegacy ),
350
343
Table0 = [{<<" shovelled-by" >>, ClusterName },
@@ -357,19 +350,6 @@ parse_amqp091_dest({VHost, Name}, ClusterName, Def, SourceHeaders) ->
357
350
AddTimestampHeaderLegacy = pget (<<" add-timestamp-header" >>, Def , false ),
358
351
AddTimestampHeader = pget (<<" dest-add-timestamp-header" >>, Def ,
359
352
AddTimestampHeaderLegacy ),
360
- PubPropsFun = fun (SrcURI , DestURI , P0 ) ->
361
- P = set_properties (P0 , SetProps ),
362
- P1 = case AddHeaders of
363
- true -> rabbit_shovel_util :update_headers (
364
- Table0 , SourceHeaders ++ Table2 ,
365
- SrcURI , DestURI , P );
366
- false -> P
367
- end ,
368
- case AddTimestampHeader of
369
- true -> rabbit_shovel_util :add_timestamp_header (P1 );
370
- false -> P1
371
- end
372
- end ,
373
353
% % Details are only used for status report in rabbitmqctl, as vhost is not
374
354
% % available to query the runtime parameters.
375
355
Details = maps :from_list ([{K , V } || {K , V } <- [{dest_exchange , DestX },
@@ -379,10 +359,42 @@ parse_amqp091_dest({VHost, Name}, ClusterName, Def, SourceHeaders) ->
379
359
maps :merge (#{module => rabbit_amqp091_shovel ,
380
360
uris => DestURIs ,
381
361
resource_decl => DestDeclFun ,
382
- fields_fun => PubFun ,
383
- props_fun => PubPropsFun
362
+ fields_fun => {? MODULE , fields_fun , [X , Key ]},
363
+ props_fun => {? MODULE , props_fun , [Table0 , Table2 , SetProps ,
364
+ AddHeaders , SourceHeaders ,
365
+ AddTimestampHeader ]}
384
366
}, Details ).
385
367
368
+ fields_fun (X , Key , _SrcURI , _DestURI , P0 ) ->
369
+ P1 = case X of
370
+ none -> P0 ;
371
+ _ -> P0 # 'basic.publish' {exchange = X }
372
+ end ,
373
+ case Key of
374
+ none -> P1 ;
375
+ _ -> P1 # 'basic.publish' {routing_key = Key }
376
+ end .
377
+
378
+ props_fun (Table0 , Table2 , SetProps , AddHeaders , SourceHeaders , AddTimestampHeader ,
379
+ SrcURI , DestURI , P0 ) ->
380
+ P = set_properties (P0 , SetProps ),
381
+ P1 = case AddHeaders of
382
+ true -> rabbit_shovel_util :update_headers (
383
+ Table0 , SourceHeaders ++ Table2 ,
384
+ SrcURI , DestURI , P );
385
+ false -> P
386
+ end ,
387
+ case AddTimestampHeader of
388
+ true -> rabbit_shovel_util :add_timestamp_header (P1 );
389
+ false -> P1
390
+ end .
391
+
392
+ dest_decl (DestQ , DestQArgs , Conn , _Ch ) ->
393
+ case DestQ of
394
+ none -> ok ;
395
+ _ -> ensure_queue (Conn , DestQ , rabbit_misc :to_amqp_table (DestQArgs ))
396
+ end .
397
+
386
398
parse_amqp10_source (Def ) ->
387
399
Uris = deobfuscated_uris (<<" src-uri" >>, Def ),
388
400
Address = pget (<<" src-address" >>, Def ),
@@ -405,16 +417,11 @@ parse_amqp091_source(Def) ->
405
417
SrcCArgs = rabbit_misc :to_amqp_table (pget (<<" src-consumer-args" >>, Def , [])),
406
418
{SrcDeclFun , Queue , DestHeaders } =
407
419
case SrcQ of
408
- none -> {fun (_Conn , Ch ) ->
409
- Ms = [# 'queue.declare' {exclusive = true },
410
- # 'queue.bind' {routing_key = SrcXKey ,
411
- exchange = SrcX }],
412
- [amqp_channel :call (Ch , M ) || M <- Ms ]
413
- end , <<>>, [{<<" src-exchange" >>, SrcX },
414
- {<<" src-exchange-key" >>, SrcXKey }]};
415
- _ -> {fun (Conn , _Ch ) ->
416
- ensure_queue (Conn , SrcQ , rabbit_misc :to_amqp_table (SrcQArgs ))
417
- end , SrcQ , [{<<" src-queue" >>, SrcQ }]}
420
+ none -> {{? MODULE , src_decl_exchange , [SrcX , SrcXKey ]}, <<>>,
421
+ [{<<" src-exchange" >>, SrcX },
422
+ {<<" src-exchange-key" >>, SrcXKey }]};
423
+ _ -> {{? MODULE , src_decl_queue , [SrcQ , SrcQArgs ]},
424
+ SrcQ , [{<<" src-queue" >>, SrcQ }]}
418
425
end ,
419
426
DeleteAfter = pget (<<" src-delete-after" >>, Def ,
420
427
pget (<<" delete-after" >>, Def , <<" never" >>)),
@@ -434,6 +441,15 @@ parse_amqp091_source(Def) ->
434
441
consumer_args => SrcCArgs
435
442
}, Details ), DestHeaders }.
436
443
444
+ src_decl_exchange (SrcX , SrcXKey , _Conn , Ch ) ->
445
+ Ms = [# 'queue.declare' {exclusive = true },
446
+ # 'queue.bind' {routing_key = SrcXKey ,
447
+ exchange = SrcX }],
448
+ [amqp_channel :call (Ch , M ) || M <- Ms ].
449
+
450
+ src_decl_queue (SrcQ , SrcQArgs , Conn , _Ch ) ->
451
+ ensure_queue (Conn , SrcQ , rabbit_misc :to_amqp_table (SrcQArgs )).
452
+
437
453
get_uris (Key , Def ) ->
438
454
URIs = case pget (Key , Def ) of
439
455
B when is_binary (B ) -> [B ];
0 commit comments