← 戻る

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

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

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

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

Maxim
Maxim 著者

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

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

Maxim
Maxim 著者

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

Alexander
Alexander

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

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

Maxim
Maxim 著者

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

Alexander
Alexander

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

Maxim
Maxim 著者

🙂

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

Тут больше проблема на мой взгляд не в 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 著者

Если это ко мне вопрос, то нет, у меня такого нет. В _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 Самунджян Артем