@@ -23,21 +23,28 @@ use recorder::MessageRecorder;
23
23
mod recorder;
24
24
25
25
pub ( crate ) trait MessageBus : Send + Sync {
26
+ // Reads the next available message from TWS
26
27
fn read_message ( & mut self ) -> Result < ResponseMessage , Error > ;
27
28
29
+ // Sends a formatted packet TWS
28
30
fn write_message ( & mut self , packet : & RequestMessage ) -> Result < ( ) , Error > ;
29
31
30
- fn send_generic_message ( & mut self , request_id : i32 , packet : & RequestMessage ) -> Result < BusSubscription , Error > ;
31
- fn send_durable_message ( & mut self , request_id : i32 , packet : & RequestMessage ) -> Result < BusSubscription , Error > ;
32
- fn send_order_message ( & mut self , request_id : i32 , packet : & RequestMessage ) -> Result < BusSubscription , Error > ;
32
+ // Sends raw data to TWS
33
+ fn write ( & mut self , packet : & str ) -> Result < ( ) , Error > ;
33
34
34
- fn send_shared_request ( & mut self , message_id : OutgoingMessages , packet : & RequestMessage ) -> Result < BusSubscription , Error > ;
35
+ // Sends formatted message to TWS and creates a reply channel by request id.
36
+ fn send_request ( & mut self , request_id : i32 , packet : & RequestMessage ) -> Result < BusSubscription , Error > ;
35
37
36
- fn write ( & mut self , packet : & str ) -> Result < ( ) , Error > ;
38
+ // Sends formatted order specific message to TWS and creates a reply channel by order id.
39
+ fn send_order_request ( & mut self , request_id : i32 , packet : & RequestMessage ) -> Result < BusSubscription , Error > ;
37
40
41
+ // Sends formatted message to TWS and creates a reply channel by message type.
42
+ fn send_shared_request ( & mut self , message_id : OutgoingMessages , packet : & RequestMessage ) -> Result < BusSubscription , Error > ;
43
+
44
+ // Starts a dedicated thread to process responses from TWS.
38
45
fn process_messages ( & mut self , server_version : i32 ) -> Result < ( ) , Error > ;
39
46
40
- // Exists for testing when request are stubbed
47
+ // Testing interface. Tracks requests sent when Bus is stubbed.
41
48
fn request_messages ( & self ) -> Vec < RequestMessage > {
42
49
vec ! [ ]
43
50
}
@@ -54,6 +61,7 @@ struct SharedChannels {
54
61
}
55
62
56
63
impl SharedChannels {
64
+ // Creates new instance and registers request/reply pairs.
57
65
pub fn new ( ) -> Self {
58
66
let mut instance = Self {
59
67
senders : HashMap :: new ( ) ,
@@ -93,6 +101,7 @@ impl SharedChannels {
93
101
}
94
102
}
95
103
104
+ // Get receiver for specified message type. Panics if receiver not found.
96
105
pub fn get_receiver ( & self , message_type : OutgoingMessages ) -> Arc < Receiver < ResponseMessage > > {
97
106
let receiver = self
98
107
. receivers
@@ -102,6 +111,7 @@ impl SharedChannels {
102
111
Arc :: clone ( receiver)
103
112
}
104
113
114
+ // Get sender for specified message type. Panics if sender not found.
105
115
pub fn get_sender ( & self , message_type : IncomingMessages ) -> Arc < Sender < ResponseMessage > > {
106
116
let sender = self
107
117
. senders
@@ -116,6 +126,13 @@ impl SharedChannels {
116
126
}
117
127
}
118
128
129
+ // Signals are used to notify the backend when a subscriber is dropped.
130
+ // This facilitates the cleanup of the SenderHashes.
131
+ pub enum Signal {
132
+ Request ( i32 ) ,
133
+ Order ( i32 ) ,
134
+ }
135
+
119
136
#[ derive( Debug ) ]
120
137
pub struct TcpMessageBus {
121
138
reader : Arc < TcpStream > ,
@@ -129,11 +146,6 @@ pub struct TcpMessageBus {
129
146
signals_recv : Receiver < Signal > ,
130
147
}
131
148
132
- pub enum Signal {
133
- Request ( i32 ) ,
134
- Order ( i32 ) ,
135
- }
136
-
137
149
impl TcpMessageBus {
138
150
// establishes TCP connection to server
139
151
pub fn connect ( connection_string : & str ) -> Result < TcpMessageBus , Error > {
@@ -159,14 +171,47 @@ impl TcpMessageBus {
159
171
} )
160
172
}
161
173
162
- fn add_request ( & mut self , request_id : i32 , sender : Sender < ResponseMessage > ) -> Result < ( ) , Error > {
163
- self . requests . insert ( request_id, sender) ;
164
- Ok ( ( ) )
174
+ fn start_dispatcher_thread ( & mut self , server_version : i32 ) -> JoinHandle < i32 > {
175
+ let reader = Arc :: clone ( & self . reader ) ;
176
+ let requests = Arc :: clone ( & self . requests ) ;
177
+ let recorder = self . recorder . clone ( ) ;
178
+ let orders = Arc :: clone ( & self . orders ) ;
179
+ let shared_channels = Arc :: clone ( & self . shared_channels ) ;
180
+ let executions = SenderHash :: < String , ResponseMessage > :: new ( ) ;
181
+
182
+ thread:: spawn ( move || loop {
183
+ match read_packet ( & reader) {
184
+ Ok ( message) => {
185
+ recorder. record_response ( & message) ;
186
+ dispatch_message ( message, server_version, & requests, & orders, & shared_channels, & executions) ;
187
+ }
188
+ Err ( err) => {
189
+ error ! ( "error reading packet: {:?}" , err) ;
190
+ continue ;
191
+ }
192
+ } ;
193
+ } )
165
194
}
166
195
167
- fn add_order ( & mut self , order_id : i32 , sender : Sender < ResponseMessage > ) -> Result < ( ) , Error > {
168
- self . orders . insert ( order_id, sender) ;
169
- Ok ( ( ) )
196
+ fn start_cleanup_thread ( & mut self ) -> JoinHandle < i32 > {
197
+ let requests = Arc :: clone ( & self . requests ) ;
198
+ let orders = Arc :: clone ( & self . orders ) ;
199
+ let signal_recv = self . signals_recv . clone ( ) ;
200
+
201
+ thread:: spawn ( move || loop {
202
+ for signal in & signal_recv {
203
+ match signal {
204
+ Signal :: Request ( request_id) => {
205
+ requests. remove ( & request_id) ;
206
+ debug ! ( "released request_id {}, requests.len()={}" , request_id, requests. len( ) ) ;
207
+ }
208
+ Signal :: Order ( order_id) => {
209
+ orders. remove ( & order_id) ;
210
+ debug ! ( "released order_id {}, orders.len()={}" , order_id, requests. len( ) ) ;
211
+ }
212
+ }
213
+ }
214
+ } )
170
215
}
171
216
}
172
217
@@ -177,25 +222,11 @@ impl MessageBus for TcpMessageBus {
177
222
read_packet ( & self . reader )
178
223
}
179
224
180
- fn send_generic_message ( & mut self , request_id : i32 , packet : & RequestMessage ) -> Result < BusSubscription , Error > {
225
+ fn send_request ( & mut self , request_id : i32 , packet : & RequestMessage ) -> Result < BusSubscription , Error > {
181
226
let ( sender, receiver) = channel:: unbounded ( ) ;
182
227
183
- self . add_request ( request_id, sender) ?;
184
- self . write_message ( packet) ?;
185
-
186
- let subscription = SubscriptionBuilder :: new ( )
187
- . receiver ( receiver)
188
- . signaler ( self . signals_send . clone ( ) )
189
- . request_id ( request_id)
190
- . build ( ) ;
191
-
192
- Ok ( subscription)
193
- }
194
-
195
- fn send_durable_message ( & mut self , request_id : i32 , packet : & RequestMessage ) -> Result < BusSubscription , Error > {
196
- let ( sender, receiver) = channel:: unbounded ( ) ;
228
+ self . requests . insert ( request_id, sender) ;
197
229
198
- self . add_request ( request_id, sender) ?;
199
230
self . write_message ( packet) ?;
200
231
201
232
let subscription = SubscriptionBuilder :: new ( )
@@ -207,10 +238,11 @@ impl MessageBus for TcpMessageBus {
207
238
Ok ( subscription)
208
239
}
209
240
210
- fn send_order_message ( & mut self , order_id : i32 , message : & RequestMessage ) -> Result < BusSubscription , Error > {
241
+ fn send_order_request ( & mut self , order_id : i32 , message : & RequestMessage ) -> Result < BusSubscription , Error > {
211
242
let ( sender, receiver) = channel:: unbounded ( ) ;
212
243
213
- self . add_order ( order_id, sender) ?;
244
+ self . orders . insert ( order_id, sender) ;
245
+
214
246
self . write_message ( message) ?;
215
247
216
248
let subscription = SubscriptionBuilder :: new ( )
@@ -257,47 +289,10 @@ impl MessageBus for TcpMessageBus {
257
289
}
258
290
259
291
fn process_messages ( & mut self , server_version : i32 ) -> Result < ( ) , Error > {
260
- let reader = Arc :: clone ( & self . reader ) ;
261
- let requests = Arc :: clone ( & self . requests ) ;
262
- let recorder = self . recorder . clone ( ) ;
263
- let orders = Arc :: clone ( & self . orders ) ;
264
- let shared_channels = Arc :: clone ( & self . shared_channels ) ;
265
- let executions = SenderHash :: < String , ResponseMessage > :: new ( ) ;
266
-
267
- let handle = thread:: spawn ( move || loop {
268
- match read_packet ( & reader) {
269
- Ok ( message) => {
270
- recorder. record_response ( & message) ;
271
- dispatch_message ( message, server_version, & requests, & orders, & shared_channels, & executions) ;
272
- }
273
- Err ( err) => {
274
- error ! ( "error reading packet: {:?}" , err) ;
275
- continue ;
276
- }
277
- } ;
278
- } ) ;
279
-
292
+ let handle = self . start_dispatcher_thread ( server_version) ;
280
293
self . handles . push ( handle) ;
281
294
282
- let requests = Arc :: clone ( & self . requests ) ;
283
- let orders = Arc :: clone ( & self . orders ) ;
284
- let signal_recv = self . signals_recv . clone ( ) ;
285
-
286
- let handle = thread:: spawn ( move || loop {
287
- for signal in & signal_recv {
288
- match signal {
289
- Signal :: Request ( request_id) => {
290
- requests. remove ( & request_id) ;
291
- debug ! ( "released request_id {}, requests.len()={}" , request_id, requests. len( ) ) ;
292
- }
293
- Signal :: Order ( order_id) => {
294
- orders. remove ( & order_id) ;
295
- debug ! ( "released order_id {}, orders.len()={}" , order_id, requests. len( ) ) ;
296
- }
297
- }
298
- }
299
- } ) ;
300
-
295
+ let handle = self . start_cleanup_thread ( ) ;
301
296
self . handles . push ( handle) ;
302
297
303
298
Ok ( ( ) )
0 commit comments