Skip to content

Commit 13faec7

Browse files
committed
SAC: starting implementation
1 parent 5a0bd3e commit 13faec7

File tree

6 files changed

+43
-18
lines changed

6 files changed

+43
-18
lines changed

protocol/src/commands/consumer_update.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ mod tests {
7474
use super::ConsumerUpdateCommand;
7575

7676
#[test]
77-
fn subscribe_request_test() {
77+
fn consumer_update_response_test() {
7878
command_encode_decode_test::<ConsumerUpdateCommand>();
7979
}
8080
}

protocol/src/commands/consumer_update_request.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ mod tests {
8080
use super::ConsumerUpdateRequestCommand;
8181

8282
#[test]
83-
fn subscribe_request_test() {
83+
fn consumer_update_request_test() {
8484
command_encode_decode_test::<ConsumerUpdateRequestCommand>();
8585
}
8686
}

protocol/src/response/mod.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -529,13 +529,4 @@ mod tests {
529529
COMMAND_CONSUMER_UPDATE
530530
);
531531
}
532-
533-
#[test]
534-
fn consumer_update_request_response_test() {
535-
response_test!(
536-
ConsumerUpdateRequestCommand,
537-
ResponseKind::ConsumerUpdateRequest,
538-
COMMAND_CONSUMER_UPDATE_REQUEST
539-
);
540-
}
541532
}

src/client/dispatcher.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use futures::Stream;
2-
use rabbitmq_stream_protocol::Response;
2+
use rabbitmq_stream_protocol::{Response, ResponseKind};
33
use std::sync::{
44
atomic::{AtomicBool, AtomicU32, Ordering},
55
Arc,
@@ -167,7 +167,10 @@ where
167167
while let Some(result) = stream.next().await {
168168
match result {
169169
Ok(item) => match item.correlation_id() {
170-
Some(correlation_id) => state.dispatch(correlation_id, item).await,
170+
Some(correlation_id) => match item.kind_ref() {
171+
ResponseKind::ConsumerUpdate(consumer_update) => state.notify(item).await,
172+
_ => state.dispatch(correlation_id, item).await,
173+
},
171174
None => state.notify(item).await,
172175
},
173176
Err(e) => {

src/consumer.rs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@ use crate::{
2626
Client, ClientOptions, Environment, MetricsCollector,
2727
};
2828
use futures::{task::AtomicWaker, Stream};
29+
use rabbitmq_stream_protocol::commands::consumer_update::ConsumerUpdateCommand;
2930
use rand::rngs::StdRng;
3031
use rand::{seq::SliceRandom, SeedableRng};
3132

3233
type FilterPredicate = Option<Arc<dyn Fn(&Message) -> bool + Send + Sync>>;
3334

35+
type ConsumerUpdateListener = Option<Arc<dyn Fn(bool, &MessageContext) -> u64 + Send + Sync>>;
36+
3437
/// API for consuming RabbitMQ stream messages
3538
pub struct Consumer {
3639
// Mandatory in case of manual offset tracking
@@ -82,6 +85,26 @@ impl FilterConfiguration {
8285
}
8386
}
8487

88+
pub struct MessageContext {
89+
consumer: Consumer,
90+
subscriber_name: String,
91+
reference: String,
92+
}
93+
94+
impl MessageContext {
95+
pub fn get_consumer(self) -> Consumer {
96+
self.consumer
97+
}
98+
99+
pub fn get_subscriber_name(self) -> String {
100+
self.subscriber_name
101+
}
102+
103+
pub fn get_reference(self) -> String {
104+
self.reference
105+
}
106+
}
107+
85108
/// Builder for [`Consumer`]
86109
pub struct ConsumerBuilder {
87110
pub(crate) consumer_name: Option<String>,
@@ -317,27 +340,27 @@ impl MessageHandler for ConsumerMessageHandler {
317340
async fn handle_message(&self, item: MessageResult) -> crate::RabbitMQStreamResult<()> {
318341
match item {
319342
Some(Ok(response)) => {
320-
if let ResponseKind::Deliver(delivery) = response.kind() {
343+
if let ResponseKind::Deliver(delivery) = response.kind_ref() {
321344
let mut offset = delivery.chunk_first_offset;
322345

323346
let len = delivery.messages.len();
347+
let d = delivery.clone();
324348
trace!("Got delivery with messages {}", len);
325349

326350
// // client filter
327351
let messages = match &self.0.filter_configuration {
328352
Some(filter_input) => {
329353
if let Some(f) = &filter_input.predicate {
330-
delivery
331-
.messages
354+
d.messages
332355
.into_iter()
333356
.filter(|message| f(message))
334357
.collect::<Vec<Message>>()
335358
} else {
336-
delivery.messages
359+
d.messages
337360
}
338361
}
339362

340-
None => delivery.messages,
363+
None => d.messages,
341364
};
342365

343366
for message in messages {
@@ -363,6 +386,8 @@ impl MessageHandler for ConsumerMessageHandler {
363386
// TODO handle credit fail
364387
let _ = self.0.client.credit(self.0.subscription_id, 1).await;
365388
self.0.metrics_collector.consume(len as u64).await;
389+
} else {
390+
println!("other message arrived");
366391
}
367392
}
368393
Some(Err(err)) => {
@@ -377,6 +402,7 @@ impl MessageHandler for ConsumerMessageHandler {
377402
Ok(())
378403
}
379404
}
405+
380406
/// Envelope from incoming message
381407
#[derive(Debug)]
382408
pub struct Delivery {

src/superstream_consumer.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ impl SuperStreamConsumerBuilder {
105105
self.client_provided_name = String::from(name);
106106
self
107107
}
108+
109+
pub fn properties(mut self, properties: HashMap<String, String>) -> Self {
110+
self.properties = properties;
111+
self
112+
}
108113
}
109114

110115
impl Stream for SuperStreamConsumer {

0 commit comments

Comments
 (0)