-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
adding, stream method to consumer delivery struct and adding examples
- Loading branch information
1 parent
ffa07fb
commit 989be13
Showing
5 changed files
with
162 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
use futures::StreamExt; | ||
use rabbitmq_stream_client::error::StreamCreateError; | ||
use rabbitmq_stream_client::types::{ | ||
ByteCapacity, OffsetSpecification, ResponseCode, SuperStreamConsumer, | ||
}; | ||
use std::sync::atomic::{AtomicU32, Ordering}; | ||
use std::sync::Arc; | ||
use std::time::Duration; | ||
use tokio::task; | ||
use tokio::time::sleep; | ||
|
||
#[tokio::main] | ||
async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||
use rabbitmq_stream_client::Environment; | ||
let environment = Environment::builder().build().await?; | ||
let message_count = 10; | ||
let super_stream = "hello-rust-stream"; | ||
|
||
let create_response = environment | ||
.stream_creator() | ||
.max_length(ByteCapacity::GB(5)) | ||
.create_super_stream(super_stream, 3, None) | ||
.await; | ||
|
||
if let Err(e) = create_response { | ||
if let StreamCreateError::Create { stream, status } = e { | ||
match status { | ||
// we can ignore this error because the stream already exists | ||
ResponseCode::StreamAlreadyExists => {} | ||
err => { | ||
println!("Error creating stream: {:?} {:?}", stream, err); | ||
} | ||
} | ||
} | ||
} | ||
|
||
let mut super_stream_consumer: SuperStreamConsumer = environment | ||
.super_stream_consumer() | ||
.offset(OffsetSpecification::First) | ||
.build(super_stream) | ||
.await | ||
.unwrap(); | ||
|
||
let received_messages = Arc::new(AtomicU32::new(0)); | ||
|
||
for mut consumer in super_stream_consumer.get_consumers().await.into_iter() { | ||
let received_messages_outer = received_messages.clone(); | ||
|
||
task::spawn(async move { | ||
let mut inner_received_messages = received_messages_outer.clone(); | ||
while let Some(delivery) = consumer.next().await { | ||
let d = delivery.unwrap(); | ||
println!( | ||
"Got message: {:#?} from stream: {} with offset: {}", | ||
d.message() | ||
.data() | ||
.map(|data| String::from_utf8(data.to_vec()).unwrap()), | ||
d.stream(), | ||
d.offset(), | ||
); | ||
let value = inner_received_messages.fetch_add(1, Ordering::Relaxed); | ||
if value == message_count { | ||
let handle = consumer.handle(); | ||
_ = handle.close().await; | ||
break; | ||
} | ||
} | ||
}); | ||
} | ||
|
||
sleep(Duration::from_millis(20000)).await; | ||
|
||
Ok(()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
use rabbitmq_stream_client::error::StreamCreateError; | ||
use rabbitmq_stream_client::types::{ | ||
ByteCapacity, HashRoutingMurmurStrategy, Message, ResponseCode, RoutingStrategy, | ||
}; | ||
use std::sync::atomic::{AtomicU32, Ordering}; | ||
use std::sync::Arc; | ||
use tokio::sync::Notify; | ||
|
||
fn hash_strategy_value_extractor(message: &Message) -> String { | ||
String::from_utf8(Vec::from(message.data().unwrap())).expect("Found invalid UTF-8") | ||
} | ||
|
||
#[tokio::main] | ||
async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||
use rabbitmq_stream_client::Environment; | ||
let environment = Environment::builder().build().await?; | ||
let message_count = 100; | ||
let stream = "hello-rust-stream"; | ||
let confirmed_messages = Arc::new(AtomicU32::new(0)); | ||
let notify_on_send = Arc::new(Notify::new()); | ||
|
||
let _ = environment | ||
.stream_creator() | ||
.max_length(ByteCapacity::GB(5)) | ||
.create_super_stream(stream, 3, None) | ||
.await; | ||
|
||
let create_response = environment | ||
.stream_creator() | ||
.max_length(ByteCapacity::GB(5)) | ||
.create_super_stream(stream, 3, None) | ||
.await; | ||
|
||
if let Err(e) = create_response { | ||
if let StreamCreateError::Create { stream, status } = e { | ||
match status { | ||
// we can ignore this error because the stream already exists | ||
ResponseCode::StreamAlreadyExists => {} | ||
err => { | ||
println!("Error creating stream: {:?} {:?}", stream, err); | ||
} | ||
} | ||
} | ||
} | ||
|
||
let mut super_stream_producer = environment | ||
.super_stream_producer(RoutingStrategy::HashRoutingStrategy( | ||
HashRoutingMurmurStrategy { | ||
routing_extractor: &hash_strategy_value_extractor, | ||
}, | ||
)) | ||
.build(stream) | ||
.await | ||
.unwrap(); | ||
|
||
for i in 0..message_count { | ||
println!("sending message {}", i); | ||
let counter = confirmed_messages.clone(); | ||
let notifier = notify_on_send.clone(); | ||
let msg = Message::builder().body(format!("message{}", i)).build(); | ||
super_stream_producer | ||
.send(msg, move |_| { | ||
let inner_counter = counter.clone(); | ||
let inner_notifier = notifier.clone(); | ||
async move { | ||
if inner_counter.fetch_add(1, Ordering::Relaxed) == message_count - 1 { | ||
inner_notifier.notify_one(); | ||
} | ||
} | ||
}) | ||
.await | ||
.unwrap(); | ||
} | ||
|
||
notify_on_send.notified().await; | ||
let _ = super_stream_producer.close().await; | ||
Ok(()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters