Сразу извиняюсь за не полную инфу по вопросу. Не знаю всех тонкостей библиотеки которая поставляет данные, собственно с ней и проблема при работе с 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();
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
подскажите как получить реквизиты компаний по ИННСведения о контрагентах есть в ЕГРИП, ЕГРЮЛ
Я пытаюсь загрузить картинку в альбом сообществаДля этого я использую 3 шага
Я хочу вывести месяц, но что-то идёт не так и $month возвращает NULL $cat['pubdate'] - тут я получаю строку в виде 2019-12-18 12:11:57 $monthIndex = intval($monthIndex); - то что получил...