1
- use lapin:: { options:: * , types:: FieldTable , BasicProperties , Connection , ConnectionProperties } ;
2
1
use std:: convert:: TryInto ;
3
2
use std:: fmt:: Display ;
3
+ use futures:: StreamExt ;
4
+ use lapin:: { BasicProperties , Connection , ConnectionProperties , options:: * , types:: FieldTable } ;
4
5
5
6
#[ derive( Debug ) ]
6
7
enum Error {
@@ -45,7 +46,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
45
46
46
47
channel. basic_qos ( 1 , BasicQosOptions :: default ( ) ) . await ?;
47
48
48
- let consumer = channel
49
+ let mut consumer = channel
49
50
. basic_consume (
50
51
"rpc_queue" ,
51
52
"rpc_server" ,
@@ -56,44 +57,48 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
56
57
57
58
println ! ( " [x] Awaiting RPC requests" ) ;
58
59
59
- for delivery in consumer {
60
- let ( channel, delivery) = delivery?;
61
- let n = u64:: from_le_bytes (
62
- delivery
63
- . data
64
- . as_slice ( )
65
- . try_into ( )
66
- . map_err ( |_| Error :: CannotDecodeArg ) ?,
67
- ) ;
68
- println ! ( " [.] fib({})" , n) ;
69
- let response = fib ( n) ;
70
-
71
- let routing_key = delivery
72
- . properties
73
- . reply_to ( )
74
- . as_ref ( )
75
- . ok_or ( Error :: MissingReplyTo ) ?
76
- . as_str ( ) ;
77
-
78
- let correlation_id = delivery
79
- . properties
80
- . correlation_id ( )
81
- . clone ( )
82
- . ok_or ( Error :: MissingCorrelationId ) ?;
83
-
84
- channel
85
- . basic_publish (
86
- "" ,
87
- routing_key,
88
- BasicPublishOptions :: default ( ) ,
89
- response. to_le_bytes ( ) . to_vec ( ) ,
90
- BasicProperties :: default ( ) . with_correlation_id ( correlation_id) ,
91
- )
92
- . await ?;
93
-
94
- channel
95
- . basic_ack ( delivery. delivery_tag , BasicAckOptions :: default ( ) )
96
- . await ?;
60
+
61
+ while let Some ( delivery) = consumer. next ( ) . await {
62
+ if let Ok ( delivery) = delivery {
63
+ println ! ( " [x] Received {:?}" , std:: str :: from_utf8( & delivery. data) ?) ;
64
+ let n = u64:: from_le_bytes (
65
+ delivery
66
+ . data
67
+ . as_slice ( )
68
+ . try_into ( )
69
+ . map_err ( |_| Error :: CannotDecodeArg ) ?,
70
+ ) ;
71
+ println ! ( " [.] fib({})" , n) ;
72
+ let response = fib ( n) ;
73
+ let payload = response. to_be_bytes ( ) ;
74
+
75
+ let routing_key = delivery
76
+ . properties
77
+ . reply_to ( )
78
+ . as_ref ( )
79
+ . ok_or ( Error :: MissingReplyTo ) ?
80
+ . as_str ( ) ;
81
+
82
+ let correlation_id = delivery
83
+ . properties
84
+ . correlation_id ( )
85
+ . clone ( )
86
+ . ok_or ( Error :: MissingCorrelationId ) ?;
87
+
88
+ channel
89
+ . basic_publish (
90
+ "" ,
91
+ routing_key,
92
+ BasicPublishOptions :: default ( ) ,
93
+ & payload,
94
+ BasicProperties :: default ( ) . with_correlation_id ( correlation_id) ,
95
+ )
96
+ . await ?;
97
+
98
+ channel
99
+ . basic_ack ( delivery. delivery_tag , BasicAckOptions :: default ( ) )
100
+ . await ?;
101
+ }
97
102
}
98
103
99
104
Ok ( ( ) )
0 commit comments