Refactor BrokerTask
This commit is contained in:
parent
22283dc7ca
commit
ba3104ec6f
@ -1,6 +1,7 @@
|
|||||||
use log::trace;
|
use log::trace;
|
||||||
use std::{
|
use std::{
|
||||||
any::{Any, TypeId},
|
any::{Any, TypeId},
|
||||||
|
borrow::Cow,
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
marker::PhantomData,
|
marker::PhantomData,
|
||||||
};
|
};
|
||||||
@ -13,7 +14,9 @@ pub type ErasedSender = Box<dyn Any + Send + Sync>;
|
|||||||
pub trait MessageType {
|
pub trait MessageType {
|
||||||
fn message_type_id(&self) -> TypeId;
|
fn message_type_id(&self) -> TypeId;
|
||||||
|
|
||||||
fn create_sender(&self) -> ErasedSender;
|
fn message_type_name(&self) -> &'static str;
|
||||||
|
|
||||||
|
fn create_broadcast_sender(&self) -> ErasedSender;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BasicMessageType<T> {
|
pub struct BasicMessageType<T> {
|
||||||
@ -33,7 +36,11 @@ impl<T: Message> MessageType for BasicMessageType<T> {
|
|||||||
TypeId::of::<T>()
|
TypeId::of::<T>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_sender(&self) -> ErasedSender {
|
fn message_type_name(&self) -> &'static str {
|
||||||
|
std::any::type_name::<T>()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_broadcast_sender(&self) -> ErasedSender {
|
||||||
trace!(
|
trace!(
|
||||||
"Creating sender for {} ({:?})",
|
"Creating sender for {} ({:?})",
|
||||||
std::any::type_name::<T>(),
|
std::any::type_name::<T>(),
|
||||||
@ -131,14 +138,22 @@ impl<T: Message> BasicAdvertiseRequest<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct TopicEntry {
|
||||||
|
message_type_id: TypeId,
|
||||||
|
message_type_name: String,
|
||||||
|
sender: ErasedSender,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
struct Registry {
|
struct Registry {
|
||||||
senders: HashMap<TypeId, ErasedSender>,
|
topics: HashMap<Cow<'static, str>, TopicEntry>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Registry {
|
impl Default for Registry {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Registry {
|
Registry {
|
||||||
senders: HashMap::new(),
|
topics: HashMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -146,8 +161,14 @@ impl Default for Registry {
|
|||||||
impl Registry {
|
impl Registry {
|
||||||
fn get_sender_for_type(&mut self, message_type: &dyn MessageType) -> &ErasedSender {
|
fn get_sender_for_type(&mut self, message_type: &dyn MessageType) -> &ErasedSender {
|
||||||
let type_id = message_type.message_type_id();
|
let type_id = message_type.message_type_id();
|
||||||
let sender_entry = self.senders.entry(type_id);
|
let type_name = message_type.message_type_name();
|
||||||
sender_entry.or_insert_with(|| message_type.create_sender())
|
let topic_entry = self.topics.entry(type_name.into());
|
||||||
|
let topic_entry = topic_entry.or_insert_with(|| TopicEntry {
|
||||||
|
message_type_id: type_id,
|
||||||
|
message_type_name: type_name.to_string(),
|
||||||
|
sender: message_type.create_broadcast_sender(),
|
||||||
|
});
|
||||||
|
&topic_entry.sender
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_subscribe(&mut self, subscribe_request: SubscribeRequestBox) {
|
fn handle_subscribe(&mut self, subscribe_request: SubscribeRequestBox) {
|
||||||
@ -180,15 +201,13 @@ impl BrokerTask {
|
|||||||
Some(advertise_req) = self.advertise_rx.recv() => {
|
Some(advertise_req) = self.advertise_rx.recv() => {
|
||||||
registry.handle_advertise(advertise_req)
|
registry.handle_advertise(advertise_req)
|
||||||
}
|
}
|
||||||
|
else => {
|
||||||
|
trace!("no more handles to BrokerTask");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// trace!("BrokerTask exiting");
|
trace!("BrokerTask exiting");
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for BrokerTask {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
trace!("BrokerTask dropped");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user