← Назад

ReConnection не работает

            (this.Trader as SmartTrader).ReConnectionSettings.Interval = TimeSpan.FromSeconds(20);
            (this.Trader as SmartTrader).ReConnectionSettings.WorkingTime = Exchange.Test.WorkingTime;
            (this.Trader as SmartTrader).ReConnectionSettings.ConnectingAttemptCount = -1;

Подписан на события: this.Trader.Connected this.Trader.Disconnected this.Trader.ProcessDataError this.Trader.ConnectionError

Запускаю, отключаю свой вайфай через который раздается инет, через минуту получаю this.Trader.Disconnected. Жду 5 минут - ничего не происходит. Включаю инет обратно, жду 5 минут - ничего не происходит.

Комментарии (18)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Greene-nsk
Greene-nsk Автор

[3.0.16]

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: (this.Trader as SmartTrader).ReConnectionSettings.Interval = TimeSpan.FromSeconds(20); (this.Trader as SmartTrader).ReConnectionSettings.WorkingTime = Exchange.Test.WorkingTime; (this.Trader as SmartTrader).ReConnectionSettings.ConnectingAttemptCount = -1;

Подписан на события: this.Trader.Connected this.Trader.Disconnected this.Trader.ProcessDataError this.Trader.ConnectionError

Запускаю, отключаю свой вайфай через который раздается инет, через минуту получаю this.Trader.Disconnected. Жду 5 минут - ничего не происходит. Включаю инет обратно, жду 5 минут - ничего не происходит.

ConnectingAttemptCount - это для первоначального соединения. Протестил у себя (выключил адаптер, подождал ConnectionError, кстати, без Disconnected) - у меня все поднялось штатно.

Greene-nsk
Greene-nsk Автор

Мне надо как-то решить эту проблему. При реальной торговле тоже это периодически происходит. Никакого ConnectionError не приходит. Просто ITrader.Disconnected. И соединение после этого не восстанавливается, можно ждать хоть несколько часов.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Мне надо как-то решить эту проблему. При реальной торговле тоже это периодически происходит. Никакого ConnectionError не приходит. Просто ITrader.Disconnected. И соединение после этого не восстанавливается, можно ждать хоть несколько часов.

Если приходит Disconnected, то переподключение не будет работать. Оно работает только в случае ошибок. Вы точно принудительно не отключаетесь от SmartCOM? Подпишитесь как здесь показали на событие Disconnected у StClient. Интересна причина разрыва.

Greene-nsk
Greene-nsk Автор

Mikhail Sukhov:

Greene-nsk: Мне надо как-то решить эту проблему. При реальной торговле тоже это периодически происходит. Никакого ConnectionError не приходит. Просто ITrader.Disconnected. И соединение после этого не восстанавливается, можно ждать хоть несколько часов.

Если приходит Disconnected, то переподключение не будет работать. Оно работает только в случае ошибок. Вы точно принудительно не отключаетесь от SmartCOM? Подпишитесь как здесь показали на событие Disconnected у StClient. Интересна причина разрыва.

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

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: reason приходит пустой.

Это значит штатное отсоединение. Вы Dispose, Disconnect где-то вызываете?

Greene-nsk
Greene-nsk Автор

Mikhail Sukhov:

Greene-nsk: reason приходит пустой.

Это значит штатное отсоединение. Вы Dispose, Disconnect где-то вызываете?

Не вызываю. Когда вызывается Disconnect(), приходит Reason: disconnected by user.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk:

Mikhail Sukhov:

Greene-nsk: reason приходит пустой.

Это значит штатное отсоединение. Вы Dispose, Disconnect где-то вызываете?

Не вызываю. Когда вызывается Disconnect(), приходит Reason: disconnected by user.

Сначала разберемся что к чему, потом я точечно исправлю.🙂

Greene-nsk
Greene-nsk Автор

Mikhail Sukhov:

Greene-nsk:

Mikhail Sukhov:

Greene-nsk: reason приходит пустой.

Это значит штатное отсоединение. Вы Dispose, Disconnect где-то вызываете?

Не вызываю. Когда вызывается Disconnect(), приходит Reason: disconnected by user.

Сначала разберемся что к чему, потом я точечно исправлю.🙂

Вообще, вы же знаете когда зовется Dispose или Disconnect. Почему бы во всех остальных случаях не звать reconnect?

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Вообще, вы же знаете когда зовется Dispose или Disconnect. Почему бы во всех остальных случаях не звать reconnect?

Это будет правильно с точки зрения дизайна - четко понять когда ошибка, а когда ее нет.

Greene-nsk
Greene-nsk Автор

Mikhail Sukhov:

Greene-nsk: Вообще, вы же знаете когда зовется Dispose или Disconnect. Почему бы во всех остальных случаях не звать reconnect?

Это будет правильно с точки зрения дизайна - четко понять когда ошибка, а когда ее нет.

У меня есть подозрение, что главная проблема здесь не в том, почему вылазит Disconnect без ошибки, а в том, почему не приходит ConnectionError. Я выставил следующие настройки для ReConnection:

            (this.Trader as SmartTrader).ReConnectionSettings.WorkingTime = Exchange.Test.WorkingTime;
            (this.Trader as SmartTrader).ReConnectionSettings.ConnectingAttemptCount = -1;
            (this.Trader as SmartTrader).ReConnectionSettings.ReConnectingAttemptCount = -1;
            (this.Trader as SmartTrader).ReConnectionSettings.Interval = TimeSpan.FromSeconds(20);
            (this.Trader as SmartTrader).ReConnectionSettings.ExportTimeOutInterval = TimeSpan.FromSeconds(20);
            (this.Trader as SmartTrader).ReConnectionSettings.ConnectDisconnectTimeOutInterval = TimeSpan.FromSeconds(20);

Ожидал, что каждые 20 секунд соединение будет проверяться и если его нет - будет ошибка. Я отключаю интернет, и больше минуты ничего не приходит. Только потом приходит Disconnected и все.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: У меня есть подозрение, что главная проблема здесь не в том, почему вылазит Disconnect без ошибки, а в том, почему не приходит ConnectionError.

Возьмите последнюю версию.

Greene-nsk
Greene-nsk Автор

Mikhail Sukhov:

Greene-nsk: У меня есть подозрение, что главная проблема здесь не в том, почему вылазит Disconnect без ошибки, а в том, почему не приходит ConnectionError.

Возьмите последнюю версию.

Отлично. Реконнектится.

Теперь другая проблема. После реконнекта "слетают" RegisterTrades, RegisterSecurity, RegisterQuotes. Экспорт я стартую.

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk:

Mikhail Sukhov:

Greene-nsk: У меня есть подозрение, что главная проблема здесь не в том, почему вылазит Disconnect без ошибки, а в том, почему не приходит ConnectionError.

Возьмите последнюю версию.

Отлично. Реконнектится.

Теперь другая проблема. После реконнекта "слетают" RegisterTrades, RegisterSecurity, RegisterQuotes. Экспорт я стартую.

Конкретно эти события нужно запускать самостоятельно.

Greene-nsk
Greene-nsk Автор

Также я пробовал заменить автоматический реконнект своим, раз уж он не работает:


                    // подписываемся на событие разрыва соединения
                    this.Trader.Disconnected += () =>
                    {
                        this.IsConnected = false;

                        if (!_IsDisconnectScheduled)
                        {
                            Log.OutError("Произошел незапланированный разрыв связи.");
                            int secToWait = 20;
                            Log.Out("Ждем " + secToWait + " секунд и восcтанавливаем соединение.", LogLevel.notice);
                            Common.Async(() =>
                                {
                                    Thread.Sleep(TimeSpan.FromSeconds(secToWait));
                                    this.Connect();
                                });
                        }
                        else
                        {
                            Log.Out("Соединение разорвано.", LogLevel.notice);
                        }
                    };

                    // подписываемся на событие успешного соединения
                    this.Trader.Connected += () =>
                    {
                        this.IsConnected = true;
                        Log.Out("Соединение установлено.", LogLevel.notice);

                        // запускаем экпорт, если не запущен
                        if (!this.Trader.IsExportRunning)
                        {
                            Log.Out("Запускаем экспорт " + Const.TraderType + " ...", LogLevel.notice);
                            this.Trader.StartExport();
                        }

                        _ConnectHandle.Set();
                    };

После такого восстановления соединение восстанавливается, но события перестают приходить. Это описано в http://stocksharp.com/forum/1446/sobytiia-nie-prikhodiat-poslie-riestarta-soiedinieniia/ . Видимо регистрация слетает , и надо заново регистрировать все бумаги?

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: После такого восстановления соединение восстанавливается, но события перестают приходить. Это описано в http://stocksharp.com/forum/1446/sobytiia-nie-prikhodiat-poslie-riestarta-soiedinieniia/ . Видимо регистрация слетает , и надо заново регистрировать все бумаги?

Я же там ответил насчет инструментов и портфелей.

Greene-nsk
Greene-nsk Автор
            (this.Trader as SmartTrader).ReConnectionSettings.WorkingTime = Exchange.Test.WorkingTime;
            (this.Trader as SmartTrader).ReConnectionSettings.ConnectingAttemptCount = -1;
            (this.Trader as SmartTrader).ReConnectionSettings.ReConnectingAttemptCount = -1;
            (this.Trader as SmartTrader).ReConnectionSettings.Interval = TimeSpan.FromSeconds(20);
            (this.Trader as SmartTrader).ReConnectionSettings.ExportTimeOutInterval = TimeSpan.FromSeconds(20);
            (this.Trader as SmartTrader).ReConnectionSettings.ConnectDisconnectTimeOutInterval = TimeSpan.FromSeconds(20);

Каждый день ровно в 6:00 по Москве связь разрывается, и потом не поднимается. Идет куча ошибок Сервер RPC недоступен. Тоже самое часто происходит просто при разрыве связи - соединение не восстанавливается.


22.03.2011 6:00:04 [OpenWealth.StockSharp.TraderInitializator.SmartServer_Disconnected] Reason:  (22255690)
22.03.2011 6:00:05 [OpenWealth.StockSharp.TraderInitializator.Trader_Disconnected] ERROR: Произошел незапланированный разрыв связи. (908)
22.03.2011 6:00:05 [OpenWealth.StockSharp.TraderInitializator.Trader_Disconnected] Ждем 20 секунд и восcтанавливаем соединение. (0)
22.03.2011 6:00:26 [OpenWealth.StockSharp.TraderInitializator.Connect] Соединяемся с сервером ... (20431)
22.03.2011 6:00:32 [OpenWealth.StockSharp.TraderInitializator.Trader_ConnectionError] ERROR: Ошибка соединения System.InvalidOperationException: WINSOCK (6056)
22.03.2011 6:00:32 [OpenWealth.StockSharp.TraderInitializator.Connect] FATAL ERROR: Отсутствует соединение с Smart. (33)
22.03.2011 6:00:52 [OpenWealth.StockSharp.TraderInitializator.Trader_ConnectionError] ERROR: Ошибка соединения System.InvalidOperationException: Соединение не было установлено. (20394)
22.03.2011 6:01:12 [OpenWealth.StockSharp.TraderInitializator.Trader_ConnectionError] ERROR: Ошибка соединения System.Runtime.InteropServices.COMException (0x800706BA): Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)
   в StClientLib.StServerClass.disconnect()
   в Ecng.Trading.Smart.SmartComWrapper.#=qnCgDm1vHPvXpt7N3mOxtVy8NZjT2eQuyDSB5hXbNr7Q=(StServer #=qKUBRzCyeMBm8zUOTVMXn3A==)
   в Ecng.Trading.Smart.SmartComWrapper.#=q75j_Z5JSRxNkiXV88FHEug==(Action`1 #=qqKsTnjrmu7pdXnaFSMdxhw==)
   в Ecng.Trading.Smart.SmartComWrapper.Disconnect()
   в Ecng.Trading.Smart.SmartTrader.OnDisconnect()
   в Ecng.Trading.Algo.BaseTrader.Disconnect()
   в Ecng.Trading.Algo.BaseTrader.#=qgA3BsOJZFeBWXFGAp7wz7Q==() (19556)
22.03.2011 6:01:39 [OpenWealth.StockSharp.TraderInitializator.Trader_ConnectionError] ERROR: Ошибка соединения System.Runtime.InteropServices.COMException (0x800706BA): Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)
   в StClientLib.StServerClass.disconnect()
   в Ecng.Trading.Smart.SmartComWrapper.#=qnCgDm1vHPvXpt7N3mOxtVy8NZjT2eQuyDSB5hXbNr7Q=(StServer #=qKUBRzCyeMBm8zUOTVMXn3A==)
   в Ecng.Trading.Smart.SmartComWrapper.#=q75j_Z5JSRxNkiXV88FHEug==(Action`1 #=qqKsTnjrmu7pdXnaFSMdxhw==)
   в Ecng.Trading.Smart.SmartComWrapper.Disconnect()
   в Ecng.Trading.Smart.SmartTrader.OnDisconnect()
   в Ecng.Trading.Algo.BaseTrader.Disconnect()
   в Ecng.Trading.Algo.BaseTrader.#=qgA3BsOJZFeBWXFGAp7wz7Q==() (27695)

...

Mikhail Sukhov
Mikhail Sukhov

Greene-nsk: Каждый день ровно в 6:00 по Москве связь разрывается, и потом не поднимается. Идет куча ошибок Сервер RPC недоступен. Тоже самое часто происходит просто при разрыве связи - соединение не восстанавливается.

Пока не понял, почему Смарт иногда поднимается, а иногда нет.