RabbitMQ блокирует поток на входящие данные. C#

85
22 января 2022, 17:20

Сразу извиняюсь за не полную инфу по вопросу. Не знаю всех тонкостей библиотеки которая поставляет данные, собственно с ней и проблема при работе с RabbitMQ.

Библиотека поставляет биржевые данные. Порядок такой. 1. Подписываюсь на финансовый инструмент(их больше 300) 2. Получаю успешно данные 3. Отправляю по RabbitMQ получателю.

Данных по каждому фин. инструменту идет много(каждый принт на бирже). Все работает, приложение успевает, RabbitMQ справляется на ура. Вот как я это делаю.

void feed_OnStreamTrade(string symbol, int tradeFlags, object tradeConditions, byte tradeExchange, double tradePrice, int tradeSize, DateTime tradeDatetime) 
        { 
            //tradeconditions is an array of 4 bytes 
            byte[] tradeConditionsArray = (byte[])tradeConditions; 
 
            //create data string 
            string data = "Stream Trade: " + symbol + "; tradeFlags: " + tradeFlags + "," + tradeConditionsArray[0] + "-" + tradeConditionsArray[1] + "-" + tradeConditionsArray[2] + "-" + tradeConditionsArray[3] + "," + 
                tradeExchange + "; tradePrice:" + tradePrice + "; tradeSize:" + tradeSize + "; Time:" + tradeDatetime.ToString(); 
            SendModel sendModel = new SendModel(); 
 
            try 
            { 
                _printDictionary.TryGetValue(symbol.ToUpper(), out this._printModel); 
                _printModel.Symbol = symbol; 
                _printModel.TradePrice = tradePrice; 
                _printModel.TradeSize = tradeSize; 
                _printModel.LastTime = tradeDatetime; 
                _printModel.Type = 1; 
                sendModel.Type = "print"; 
                sendModel.Print = _printModel; 
 
                _sender.Send(sendModel); // - отправка в кролик 
 
            } 
            catch 
            { 
                Console.WriteLine(data); 
            } 
        }

Это метод библиотеки и сюда автоматом вываливаются все принты инструментов, на которые я подписался. Идут они примерно в секунду по 50-200 штук в общем и со всеми норм справляется RabbitMQ. RabbitMQ ставит их в очередь и отправляет. Именно для очереди я и брал кролика.

но каждые 5 мин я делаю запрос на еще одни данные в этом классе(в это время принты по первому методу продолжают строчить)

 int requestId = ActiveTickFeed.feed.SendBarHistoryRequest(ticker, (short)ActiveTickFeedLib.ATBarHistoryEnum.ATBarHistoryIntraday, 5, DateTime.Now - TimeSpan.FromDays(1), DateTime.Now);

И они должны прийти в другой метод. Вот этот.

void feed_OnBarHistoryResponse(int originalRequestId, short barHistoryResponseCode, string symbol, short symbolStatusCode, object records)

И тут возникает проблема. Метод просто не реагирует и печатает в консоль

request 9887 timeout И таких печатей по каждому запросу для вторых данных.

Если в первом методе я закоментирую отправку в кролика и просто буду выводить в консоль, то тогда норм работает. Хз как но раббит блочит возможность мне принимать данные со второго метода.

//_sender.Send(sendModel); // - отправка в кролик
Console.WriteLine(data);

Вот так данные с первого метода продолжают приходить и данные со второго метода не блокируются. Т.е. причина в _sender

Вот метод _sender()

public void Send(SendModel print)
    {
        var factory = new ConnectionFactory() { HostName = "localhost" };
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: "hello",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);
            byte[] messageBody = print.ToByteArray();
            channel.BasicPublish(exchange: "",
             routingKey: "hello",
             basicProperties: null,
             body: messageBody);
        }
    }

Как разрешить эту проблему. Пытался каждый _sender обернуть в Task.Run вот так, не помогло

var task = Task.Factory.StartNew(() =>
            {
                _sender.Send(sendModel);
            });
            task.Wait();
READ ALSO
Автозаполнение реквизитов по ИНН

Автозаполнение реквизитов по ИНН

подскажите как получить реквизиты компаний по ИННСведения о контрагентах есть в ЕГРИП, ЕГРЮЛ

182
Ошибка хэша при сохранении изображения на сервере VK

Ошибка хэша при сохранении изображения на сервере VK

Я пытаюсь загрузить картинку в альбом сообществаДля этого я использую 3 шага

102
NULL при return в функции для получения месяца

NULL при return в функции для получения месяца

Я хочу вывести месяц, но что-то идёт не так и $month возвращает NULL $cat['pubdate'] - тут я получаю строку в виде 2019-12-18 12:11:57 $monthIndex = intval($monthIndex); - то что получил...

86
Корректное сравнение даты

Корректное сравнение даты

ПодскажитеВ бд записывается дата с +7 дней от текущей

70