Протестировал, на клиринге вылетают те же ошибки. (Может я не на то смотрю и ошибки вообще не связаны с тем что frontman менял?)
Первая ошибка это "P2ERR_SERV_NO_SERVICE". На сколько я помню она вылетает потому что на клиринге потоки закрываются, и мы тогда решили что это нормальния ситуация и надо эту ошибку просто игнорить, написали соответствующий код. Что изменилось с тех пор, почему решили вернуть её обратно?
Вторая ошибка: "Инструменты GAZR28@RTS и GASP@RTS имеют одинаковый идентификатор инструмента 167736 торговой системы (тот самый IsinID??)". Странная ошибка, что за инструмент GAZR28, или USDRUB23?
Далее вопрос frontman'y по коду:
Code
private void OnSessionContentsDerivativeStreamInserted(PlazaRecord record, PlazaSessionContentsDerivativeColumns metadata, Action<Security> initHandler, Action<Security> updateHandler)
{
ProcessEvents(() =>
{
var isinId = record.Get<int>(metadata.IsinId);
var secCode = record.Get<string>(metadata.ShortIsin);
GetSecurity(CreateSecurityId(secCode, "RTS"), security =>
{
if (_secCodeAndIsinIds.TryAdd(secCode, isinId))
{
InitSecurityInfo(security, record, metadata);
security.Code = secCode;
initHandler(security);
}
else
{
_newAndOldIsinIds.TryAdd(isinId, _secCodeAndIsinIds[secCode]);
}
UpdateSecurityInfo(security, record, metadata);
updateHandler(security);
}, isinId.ToString());
});
}
Я так понял это событие обрабатывает приход новых инструментов. Сначала мы сохраняем в словарь пары ShortIsin-IsinId, а затем если инструмент с такимже ShortIsin пришел второй раз сохраняем пару "новый IsinId-старый IsinId"?
Code
private void ProcessPlazaStream(PlazaRecord record, PlazaColumn isinIdColumn, bool ignoreIfNotExist, Action<Security> action)
{
var newIsinId = record.Get<int>(isinIdColumn);
var oldIsinId = _newAndOldIsinIds.TryGetValue(newIsinId);
var isinId = (oldIsinId == 0 ? newIsinId : oldIsinId).ToString();
ProcessEvents(() => ProcessSecurityAction(isinId, action, ignoreIfNotExist));
}
Здесь в ProcessSecurityAction мы пытаемся подсунуть тот isinId который был до клиринга, ищем его в словаре _newAndOldIsinIds. Я так понимаю метод ProcessPlazaStream вызывается очень часто, и такая вот конструкция с поиском в словаре будет сильно все замедлять. Но вопрос оптимизации это уже второй вопрос, главное сейчас чтоб хоть как-то заработало=)