Проблемы при переподключении.
Atom Ответить
01.08.2012


Всем добрый день.

Запускаем коннектор.
Коннектор работает нормально.
Во время работы отключаем плаза роутер, ждем некоторое время, включаем роутер обратно.
Коннектор восстанавливает соединение с роутером, получает данные секунд 15, а после этого отключается.

Собственный лог с момента восстановления соединения:
Код

Datetime	Message	Details	Status	Thread
2012-08-01 15:28:15.5047430	Log	System.TimeoutException: Соединение не было разорвано в отведенный отрезок времени.	Info   	14
2012-08-01 15:28:15.5027430	ConnectionError	"Message: Соединение не было разорвано в отведенный отрезок времени.; TargetSite: ; Source: ; StackTrace: ; "	Error  	14
2012-08-01 15:28:15.4997430	Log	RaiseConnectionError - disconnected	Info   	14
2012-08-01 15:28:15.4967420	Log	OnConnectionStatusChanged: conn OrderLog_2 - status: Disconnected	Info   	14
2012-08-01 15:28:15.4437370	Log	OnConnectionStatusChanged: conn OrderLog_1 - status: Disconnected	Info   	14
2012-08-01 15:28:15.3467270	Disconnected	NULL	Info   	14
2012-08-01 15:28:15.3467270	Log	OnConnectionStatusChanged: conn OrderLog_0 - status: Disconnected	Info   	14
2012-08-01 15:27:45.2922170	ConnectionRestored	NULL	Info   	14
2012-08-01 15:27:37.3362170	Log	PlazaStream FORTS_OPTINFO_REPL:StreamStateChanged: State Online	Info   	17
2012-08-01 15:27:37.0272170	Log	PlazaStream FORTS_FUTINFO_REPL:StreamStateChanged: State Online	Info   	17
2012-08-01 15:27:36.7302170	Log	PlazaStream FORTS_OPTCOMMON_REPL:StreamStateChanged: State Online	Info   	17
2012-08-01 15:27:35.9932170	Log	PlazaStream FORTS_FUTCOMMON_REPL:StreamStateChanged: State Online	Info   	17
2012-08-01 15:27:35.6812170	Log	PlazaStream FORTS_OPTINFO_REPL:StreamStateChanged: State RemoveSnapshot	Info   	17
2012-08-01 15:27:35.6702170	Log	PlazaStream FORTS_OPTINFO_REPL:StreamLifeNumChanged: LifeNum 2748	Info   	17
2012-08-01 15:27:35.6582170	Log	PlazaStream FORTS_OPTINFO_REPL:StreamStateChanged: State ReOpenned	Info   	17
2012-08-01 15:27:35.6462170	Log	PlazaStream FORTS_OPTCOMMON_REPL:StreamStateChanged: State RemoveSnapshot	Info   	17
2012-08-01 15:27:35.6332170	Log	PlazaStream FORTS_OPTCOMMON_REPL:StreamLifeNumChanged: LifeNum 27254	Info   	17
2012-08-01 15:27:35.6232170	Log	PlazaStream FORTS_OPTCOMMON_REPL:StreamStateChanged: State ReOpenned	Info   	17
2012-08-01 15:27:35.6092170	Log	PlazaStream FORTS_FUTCOMMON_REPL:StreamStateChanged: State RemoveSnapshot	Info   	17
2012-08-01 15:27:35.5972170	Log	PlazaStream FORTS_FUTCOMMON_REPL:StreamLifeNumChanged: LifeNum 27256	Info   	17
2012-08-01 15:27:35.5872170	Log	PlazaStream FORTS_FUTCOMMON_REPL:StreamStateChanged: State ReOpenned	Info   	17
2012-08-01 15:27:35.5752170	Log	PlazaStream FORTS_FUTINFO_REPL:StreamStateChanged: State RemoveSnapshot	Info   	17
2012-08-01 15:27:35.5612170	Log	PlazaStream FORTS_FUTINFO_REPL:StreamLifeNumChanged: LifeNum 2748	Info   	17
2012-08-01 15:27:35.5562170	Log	PlazaStream FORTS_FUTINFO_REPL:StreamStateChanged: State ReOpenned	Info   	17
2012-08-01 15:27:35.5172170	Log	PlazaStream FORTS_OPTCOMMON_REPL:Поток FORTS_OPTCOMMON_REPL переоткрыт.	Info   	17
2012-08-01 15:27:35.5132170	Log	PlazaStream FORTS_OPTCOMMON_REPL:StreamStateChanged: State LocalSnapshot	Info   	17
2012-08-01 15:27:35.5032170	Log	PlazaStream FORTS_ORDLOG_REPL:StreamStateChanged: State RemoveSnapshot	Info   	18
2012-08-01 15:27:35.5012170	Log	PlazaStream FORTS_OPTCOMMON_REPL:Состояние потока Closed.	Info   	17
2012-08-01 15:27:35.4922170	Log	PlazaStream FORTS_FUTCOMMON_REPL:Поток FORTS_FUTCOMMON_REPL переоткрыт.	Info   	17
2012-08-01 15:27:35.4892170	Log	PlazaStream FORTS_FUTCOMMON_REPL:StreamStateChanged: State LocalSnapshot	Info   	17
2012-08-01 15:27:35.4882170	Log	PlazaStream FORTS_FUTCOMMON_REPL:Состояние потока Closed.	Info   	17
2012-08-01 15:27:35.4852170	Log	PlazaStream FORTS_OPTINFO_REPL:Поток FORTS_OPTINFO_REPL переоткрыт.	Info   	17
2012-08-01 15:27:35.4752170	Log	PlazaStream FORTS_ORDLOG_REPL:StreamStateChanged: State RemoveSnapshot	Info   	18
2012-08-01 15:27:35.4672170	Log	PlazaStream FORTS_OPTINFO_REPL:Состояние потока Closed.	Info   	17
2012-08-01 15:27:35.4672170	Log	PlazaStream FORTS_OPTINFO_REPL:StreamStateChanged: State LocalSnapshot	Info   	17
2012-08-01 15:27:35.4662170	Log	PlazaStream FORTS_FUTINFO_REPL:Поток FORTS_FUTINFO_REPL переоткрыт.	Info   	17
2012-08-01 15:27:35.4592170	Log	PlazaStream FORTS_FUTINFO_REPL:Состояние потока Closed.	Info   	17
2012-08-01 15:27:35.4592170	Log	PlazaStream FORTS_FUTINFO_REPL:StreamStateChanged: State LocalSnapshot	Info   	17
2012-08-01 15:27:35.4562170	Log	PlazaStream FORTS_OPTCOMMON_REPL:Инициализация FORTS_OPTCOMMON_REPL потока.	Info   	17
2012-08-01 15:27:35.4542170	Log	PlazaStream FORTS_ORDLOG_REPL:Поток FORTS_ORDLOG_REPL переоткрыт.	Info   	18
2012-08-01 15:27:35.4532170	Log	PlazaStream FORTS_FUTCOMMON_REPL:Инициализация FORTS_FUTCOMMON_REPL потока.	Info   	17
2012-08-01 15:27:35.4512170	Log	PlazaStream FORTS_ORDLOG_REPL:StreamStateChanged: State LocalSnapshot	Info   	18
2012-08-01 15:27:35.4482170	Log	PlazaStream FORTS_OPTINFO_REPL:Инициализация FORTS_OPTINFO_REPL потока.	Info   	17
2012-08-01 15:27:35.4452170	Log	PlazaStream FORTS_ORDLOG_REPL:Состояние потока Closed.	Info   	18
2012-08-01 15:27:35.4392170	Log	PlazaStream FORTS_FUTINFO_REPL:Инициализация FORTS_FUTINFO_REPL потока.	Info   	17
2012-08-01 15:27:35.4392170	Log	PlazaStream FORTS_ORDLOG_REPL:Инициализация FORTS_ORDLOG_REPL потока.	Info   	18
2012-08-01 15:27:35.4382170	Log	Attempted to connect OrderLog_1.	Info   	17
2012-08-01 15:27:35.4382170	Log	Attempted to connect OrderLog_2.	Info   	18
2012-08-01 15:27:35.4332170	Log	Экспорт запущен.	Info   	11
2012-08-01 15:27:35.4042170	Log	Экспорт не был запущен.	Info   	11
2012-08-01 15:27:35.4042170	Log	Запуск экспорта.	Info   	11
2012-08-01 15:27:35.4032170	Log	Остановка экспорта.	Info   	11
2012-08-01 15:27:35.4002170	Log	OnConnectionStatusChanged: conn OrderLog_0 - status: Connected, RouterConnected	Info   	15
2012-08-01 15:27:35.3992170	Connected	NULL	Info   	15
2012-08-01 15:27:35.3032170	Log	OnConnect	Info   	12
2012-08-01 15:27:35.3022170	Log	Attempted to connect OrderLog_0.	Info   	12
2012-08-01 15:27:35.2902170	Log	OnDisconnect	Info   	12


Лог плаза клиента с момента восстановления соединения:
Код

2012-08-01 15:28:14.857;P2ReplStorage;;Changed revs at commit; stream 0x1D758B10; cnt 1
2012-08-01 15:28:14.857;P2ReplStorage;;	tbl_idx 0; rev range 365732 - 365736
2012-08-01 15:28:14.944;p2repl-cli;;DATA message received;stream 0x1D757C70
2012-08-01 15:28:14.947;P2ReplStorage;;Changed revs at commit; stream 0x1D757C70; cnt 1
2012-08-01 15:28:14.947;P2ReplStorage;;	tbl_idx 0; rev range 1565619 - 1565633
2012-08-01 15:28:15.064;p2repl-cli;;DATA message received;stream 0x1D757C70
2012-08-01 15:28:15.064;P2ReplStorage;;Changed revs at commit; stream 0x1D757C70; cnt 1
2012-08-01 15:28:15.064;P2ReplStorage;;	tbl_idx 0; rev range 1565634 - 1565636
2012-08-01 15:28:15.183;P2ReplStorage;;Changed revs at commit; stream 0x1D0256C0; cnt 1
2012-08-01 15:28:15.183;P2ReplStorage;;	tbl_idx 0; rev range 13160814170 - 13160815579
2012-08-01 15:28:15.184;p2repl-cli;;DATA message received;stream 0x1D0256C0
2012-08-01 15:28:15.191;p2repl-cli;;DATA message received;stream 0x1D758B10
2012-08-01 15:28:15.194;P2ReplStorage;;Changed revs at commit; stream 0x1D758B10; cnt 1
2012-08-01 15:28:15.194;P2ReplStorage;;	tbl_idx 0; rev range 365737 - 365749
2012-08-01 15:28:15.194;p2repl-cli;;DATA message received;stream 0x1D757C70
2012-08-01 15:28:15.195;P2ReplStorage;;Changed revs at commit; stream 0x1D757C70; cnt 1
2012-08-01 15:28:15.195;P2ReplStorage;;	tbl_idx 0; rev range 1565637 - 1565643
2012-08-01 15:28:15.336;p2repl-cli;;DATA message received;stream 0x1D757C70
2012-08-01 15:28:15.337;P2ReplStorage;;Changed revs at commit; stream 0x1D757C70; cnt 1
2012-08-01 15:28:15.337;P2ReplStorage;;	tbl_idx 0; rev range 1565644 - 1565650
2012-08-01 15:28:15.345;P2ClientGate;;Statistics module was unregistered, module name P2ClientGate@CP2Connection
2012-08-01 15:28:15.345;p2mq-cli;;Socket closed;conn 0x1CF84710
2012-08-01 15:28:15.443;P2ClientGate;;Statistics module was unregistered, module name P2ClientGate@CP2Connection
2012-08-01 15:28:15.443;p2mq-cli;;Socket closed;conn 0x1CF5E8B0
2012-08-01 15:28:15.496;P2ReplStorage;;Changed revs at commit; stream 0x1D0256C0; cnt 1
2012-08-01 15:28:15.496;P2ReplStorage;;	tbl_idx 0; rev range 13160815580 - 13160816989
2012-08-01 15:28:15.496;P2ClientGate;;Statistics module was unregistered, module name P2ClientGate@CP2Connection
2012-08-01 15:28:15.496;p2mq-cli;;Socket closed;conn 0x1CF5EC90



Подозрение падает на строчки:
«2012-08-01 15:28:15.443;P2ClientGate;;Statistics module was unregistered, module name P2ClientGate@CP2Connection»


Почему при обычном коннекте все работает нормально, а при разрыве связи и последующем реконекте работает все плохо?
Помогите, пожалуйста, разобраться.

Теги:


Спасибо:




22 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.08.2012
Ответить


А где логи стокшарпа?
Спасибо:

Maxim

Фотография
Дата: 01.08.2012
Ответить


Какие именно?

Если те, которые выводятся в событие Log, то именно они выше и указаны.
Автор топика
Спасибо:

Maxim

Фотография
Дата: 04.08.2012
Ответить


«Бен, это Данила, ай нид хелп»
Автор топика
Спасибо:

Alexander

Фотография
Дата: 04.08.2012
Ответить


Maxim Перейти
«Бен, это Данила, ай нид хелп»


С ревизиями вопрос решился?
Спасибо:

Maxim

Фотография
Дата: 04.08.2012
Ответить


Этот вопрос не связан с ревизиями.
Про ревизии сейчас напишу в том топике.

Автор топика
Спасибо:

Alexander

Фотография
Дата: 04.08.2012
Ответить


Могу предоставить исходники ReConnectionManager чтобы ты попробовал самостоятельно разобраться с данной проблемой.
Спасибо:

Maxim

Фотография
Дата: 04.08.2012
Ответить


Smile

Лучше конечно решение на блюдечке Smile

Тут больше проблема на мой взгляд не в ReConnectionManager.
Так как заливка данных возобновляется, работает секунд 15 и отваливается.

Подозреваю, здесь где-то косяк на уровне:
(конструктор PlazaTrader или метод Connect) + (регистрация COM объекта).

Поэтому сорсы ReConnectionManager вряд ли помогут.
Тут надо хорошо разбираться в процессе соединения c роутером в PlazaTrader.
А этот процесс я не совсем хорошо понимаю, так как не разбирался досконально в Плазе2.

Но... Если конечно никто из разработчиков этим вопросом заниматься не планирует,
кидай сорсы. Буду ковыряться.
Автор топика
Спасибо:

Alexander

Фотография
Дата: 04.08.2012
Ответить


Ну сорсы плазы у тебя уже есть, так что разбираться в connect + com можно

Разработчики заняты слишком другими вопросами сейчас.
Спасибо:

ra81

Фотография
Дата: 23.08.2012
Ответить


Подтверждаю багу в ReConnectManager. только у меня не отваливается коннектор. Просто мессадж падает в лог об ошибке. И все.

Цитата:
09:14:13.937 | Error | AlfaTrader | System.TimeoutException: Соединение не было установлено в отведенный отрезок времени.


Потом все работает норм. У меня правда AlfaDirect
Спасибо:

ra81

Фотография
Дата: 25.08.2012
Ответить


У вас в коде нигде нет подобных строчек

Код
_trader.Disconnected += _trader.Connect;


Ну или может быть что нить типо такого

Код
_trader.Disconnected += DoSomeThing;

// какойто код

private void DoSomeThing()
{
     // какой то код
     _trader.Connect;
}


На плазе не проверял но на АльфаДирект это четко приводит к вышеописанной ошибке. Отвал событий, экспорта данных и прочих радостей. Подозреваю что связано с прямой передачей событий от терминала/шлюза в коннектор. Что приводит к эдакому дедлоку чтоли :)
Спасибо:

Maxim

Фотография
Дата: 31.08.2012
Ответить


Если это ко мне вопрос, то нет, у меня такого нет.
В _trader.Disconnected просто логируется информация.
Автор топика
Спасибо:

Garry

Фотография
Дата: 15.01.2013
Ответить


Аналогичная проблема, после попытки переподключения в логе ошибка
2013/01/15 12:44:09.353|Error |PlazaTrader|System.TimeoutException: Соединение не было разорвано в отведенный отрезок времени. И все на этом стопорится.
Коннектор из S# 4.1.7 с кодплекса, роутер 1.4.11_32
logS#.txt 26 KB (0) LOGrouter.txt 3 MB (0)
Спасибо:

Alexander

Фотография
Дата: 15.01.2013
Ответить


Проблема известна и уже была занесена в список тасков ранее.
Спасибо:

Garry

Фотография
Дата: 15.01.2013
Ответить


Ну есть перспективы решения? просто уже 5 месяцев прошло, вроде довольно ходовой коннектор, а перезапускать робота, если пропадет инет как то не хотелось бы. Вот, может быть оно? http://forum.rts.micex.ru/viewtopic.asp?t=19453
Спасибо:

Alexander

Фотография
Дата: 15.01.2013
Ответить


Как только у разработчиков будет время - сразу сделаем.
Спасибо:

Garry

Фотография
Дата: 17.02.2013
Ответить


Посмотрел исходники, поэкспериментировал с проблемой, действительно роутер ведет себя как то странно после восстановления связи, постоянные ошибки

2013/02/17 13:34:38.102|Error |PlazaTrader|StockSharp.Plaza.PlazaException: Ошибка подключения к серверу Плазы. Код -2147196927, описание 'P2ERR_MQ_NOT_INITIALIZED_YET'. ---> System.Runtime.InteropServices.COMException: Couldn't connect to MQ

, хотя до этого все локальные соединения были корректно завершены. Возможно действительно проблема в Роутере(та что выше по ссылке на форум РТС). Рестарт роутера помогает, добавил Router.Restart(); в метод OnConnect() Плаза трейдера, пересобрал, все отлично восстанавливается. Но вот рестарт роутера при каждой попытке соединения, уж больно радикальное решение, хотя все же решение.
Спасибо:

Garry

Фотография
Дата: 19.02.2013
Ответить


Еще и в BaseTrader метод SafeDisconnect вызывает Disconnect(); без проверки (почему-то if (IsConnected) закоментарен) Соответсвенно ReConectionManager ждет события Trader.Disconnected, которого никогда не будет. Из-за этого вылезает ошибка таймаута:
2013/01/15 12:44:09.353|Error |PlazaTrader|System.TimeoutException: Соединение не было разорвано в отведенный отрезок времени.

private void SafeDisconnect()
{
try
{
//if (IsConnected)
Disconnect();
}
catch (Exception ex)
{
RaiseConnectionError(ex);
}
}
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 20.02.2013
Ответить


Garry Перейти
Еще и в BaseTrader метод SafeDisconnect вызывает Disconnect(); без проверки (почему-то if (IsConnected) закоментарен) Соответсвенно ReConectionManager ждет события Trader.Disconnected, которого никогда не будет. Из-за этого вылезает ошибка таймаута:


IsConnected закомментарен, потому что он сам может вызвать исключение. Поэтому всегда вызывается отключение, Disconnect. После его вызова и должно прийти событие успешного отключения. Почему оно не приходит?
Спасибо:

Garry

Фотография
Дата: 20.02.2013
Ответить


Оно приходит один раз, при разрыве связи, а ReConnectionManager, вызывает Trader.Reconnect через интервалы, в PlazaTrader метод Reconnect не определен, он определен только в BaseTrader
public virtual void Reconnect()
{
SafeDisconnect();
Connect();
}
SafeDisconnect(); вызывает Disconnect всегда т.к. IsConnected закоментарен. Disconnect опять же определен только в BaseTrader
public void Disconnect()
{
_reConnectionManager.Disconnect(() => RaiseConnectionError(new TimeoutException("Соединение не было разорвано в отведенный отрезок времени.")));
OnDisconnect();
}

т.е. ReConnectionManager ждет событие каждый раз при реконнекте, тут надо либо раскоментарить IsConnected или переопределить Disconnect() Reconnect() в PlazaTrader
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 20.02.2013
Ответить


Я совсем запутался.Sad
Спасибо:

Garry

Фотография
Дата: 20.02.2013
Ответить


Ну я тоже не сразу разобрался. Суть в том что, PlazaTrader выдает событие Disconnect 1 раз при обрыве связи, а ReConnectionMasnager ждет его каждый раз при переподключении, поэтому вылезает таймаут. Соответсвенно выхода 2, выдавать его либо не ждать.
Спасибо:

Garry

Фотография
Дата: 20.02.2013
Ответить


В общем кому интересно, выкладываю вариант с рабочим переподключением (исправил как сам думаю). Протестировал. Изменил всего 2 метода(жирный шрифт).

1-PlazaTrader.cs Перезапуск роутера при соединении:

protected override void OnConnect()
{
// Для удобства проверяем, запущен ли P2MQRouter.exe?
// Если это не делать, COM-библиотека Плазы будет выкидывать одну и ту же ошибку ('Couldn't resolve MQ service'),
// и когда P2MQRouter.exe не запущен,
// и когда нет связи с сервером Плазы или не ведутся торги.

//if (_connectionPool.IsLocal && Router.Status != ServiceControllerStatus.Running)
// throw new InvalidOperationException("На компьютере не установлена или не запущена программа P2MQRouter.exe.");
Router.Restart();
while (Router.Status != System.ServiceProcess.ServiceControllerStatus.Running)
{
System.Threading.Thread.Sleep(200);
}

_transactionManager.Start();

_connectionPool.Connect();

this.AddInfoLog("OnConnect");
}


2 - PlazaConnectionPool.cs принудительный вызов события disconnected при вызове метода Disconnect()


public void Disconnect()
{
_connectDone = false;
ChangeConnection(Disconnect);
_disconnected();
IsConnected = false;

}
Спасибо: Mikhail Sukhov Самунджян Артем


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy