Add websocket infinite inserting
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
@@ -1,13 +1,18 @@
|
||||
use super::State;
|
||||
use crate::{config::Config, database};
|
||||
use crate::config::{Config, CLICKHOUSE_BATCH_NEWS_SIZE};
|
||||
use async_trait::async_trait;
|
||||
use clickhouse::inserter::Inserter;
|
||||
use log::{debug, error, info};
|
||||
use qrust::types::{alpaca::websocket, News};
|
||||
use qrust::{
|
||||
types::{alpaca::websocket, News},
|
||||
utils::ONE_SECOND,
|
||||
};
|
||||
use std::{collections::HashMap, sync::Arc};
|
||||
use tokio::sync::RwLock;
|
||||
use tokio::sync::{Mutex, RwLock};
|
||||
|
||||
pub struct Handler {
|
||||
pub config: Arc<Config>,
|
||||
pub inserter: Arc<Mutex<Inserter<News>>>,
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
@@ -74,19 +79,11 @@ impl super::Handler for Handler {
|
||||
}
|
||||
websocket::data::incoming::Message::News(message) => {
|
||||
let news = News::from(message);
|
||||
|
||||
debug!(
|
||||
"Received news for {:?}: {}.",
|
||||
news.symbols, news.time_created
|
||||
);
|
||||
|
||||
database::news::upsert(
|
||||
&self.config.clickhouse_client,
|
||||
&self.config.clickhouse_concurrency_limiter,
|
||||
&news,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
self.inserter.lock().await.write(&news).await.unwrap();
|
||||
}
|
||||
websocket::data::incoming::Message::Error(message) => {
|
||||
error!("Received error message: {}.", message.message);
|
||||
@@ -98,4 +95,21 @@ impl super::Handler for Handler {
|
||||
fn log_string(&self) -> &'static str {
|
||||
"news"
|
||||
}
|
||||
|
||||
async fn run_inserter(&self) {
|
||||
super::run_inserter(self.inserter.clone()).await;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_handler(config: Arc<Config>) -> Box<dyn super::Handler> {
|
||||
let inserter = Arc::new(Mutex::new(
|
||||
config
|
||||
.clickhouse_client
|
||||
.inserter("news")
|
||||
.unwrap()
|
||||
.with_period(Some(ONE_SECOND))
|
||||
.with_max_entries((*CLICKHOUSE_BATCH_NEWS_SIZE).try_into().unwrap()),
|
||||
));
|
||||
|
||||
Box::new(Handler { config, inserter })
|
||||
}
|
||||
|
Reference in New Issue
Block a user