← Zurück

Проблемы при переподключении.

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

Запускаем коннектор. Коннектор работает нормально. Во время работы отключаем плаза роутер, ждем некоторое время, включаем роутер обратно. Коннектор восстанавливает соединение с роутером, получает данные секунд 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»

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (22)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

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

Maxim
Maxim Autor

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

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

Maxim
Maxim Autor

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

Alexander
Alexander

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

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

Maxim
Maxim Autor

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

Alexander
Alexander

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

Maxim
Maxim Autor

🙂

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

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

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

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

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

Alexander
Alexander

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

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

ra81
ra81

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

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

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

ra81
ra81

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

_trader.Disconnected += _trader.Connect;

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

_trader.Disconnected += DoSomeThing;

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

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

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

Maxim
Maxim Autor

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

Garry
Garry

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

Alexander
Alexander

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

Garry
Garry

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

Alexander
Alexander

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

Garry
Garry

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

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
Garry

Еще и в 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
Mikhail Sukhov

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

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

Garry
Garry

Оно приходит один раз, при разрыве связи, а 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
Mikhail Sukhov

Я совсем запутался.😢

Garry
Garry

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

Garry
Garry

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

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

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");
	}

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

	public void Disconnect()
	{
		_connectDone = false;
		ChangeConnection(Disconnect);
        **_disconnected();
        IsConnected = false;**
	}
Mikhail Sukhov Самунджян Артем