Один Синглетон живет, а другой - дохнет...
От: AGor  
Дата: 16.03.06 19:33
Оценка:
Ох ужж ентот ремотинг, Господа!

Уже все наладил, практически со всем разобрался — а тут опять...
В кратце странность такая. Есть два разный объекта — одинаково зарегестирированны как Синглетоны, один порт, разные ури, лайфтайм прописан одинаково — бесконечноживущие:

public override object InitializeLifetimeService()
{ ILease lease = (ILease)base.InitializeLifetimeService();
if (lease.CurrentState == LeaseState.Initial)
{ lease.InitialLeaseTime = TimeSpan.Zero; }
return lease; }

Тобишь вся конфигурация ремотинга под них по принципу Copy-Paste. Близнецы.

Запускаю первый — работает как часы. Через некоторое время — запускаю второй работает. Но через некоторое всемя — дохнет (при обращении к методу — RemotingException — "Объект XXXX либо, мол не существует либо дисконнектед"). А первый — нормально...

Как так? Что-то экзотическое? Почему ЛайфТайм не ставится у второго?
Может у кого-то были подобные сложности?
... << RSDN@Home 1.1.3 stable >>
Re: Один Синглетон живет, а другой - дохнет...
От: Mab Россия http://shade.msu.ru/~mab
Дата: 16.03.06 21:01
Оценка: +1
Здравствуйте, AGor, Вы писали:

AG>Ох ужж ентот ремотинг, Господа!


AG>Уже все наладил, практически со всем разобрался — а тут опять...

AG>В кратце странность такая. Есть два разный объекта — одинаково зарегестирированны как Синглетоны, один порт, разные ури, лайфтайм прописан одинаково — бесконечноживущие:
Вообще-то у бесконечноживуюих принято null возвращать в InitializeLifetimeService.
Re: Один Синглетон живет, а другой - дохнет...
От: maxluzin Европа  
Дата: 17.03.06 05:58
Оценка:
Здравствуйте, AGor, Вы писали:

AG>Ох ужж ентот ремотинг, Господа!



AG>Как так? Что-то экзотическое? Почему ЛайфТайм не ставится у второго?

AG>Может у кого-то были подобные сложности?

Поверь, ничего экзотического — чудес не бывает. 100-процентно где-то малюсенькая "фигня" (отличие) в коде. Перестань верить и убеждать самого себя, что всё "копи/пасте", давай "код — в студию"! Уверен, пока будешь писать сюда — обнаружишь разницу, и ту самую "подлую маленькую заразу", которая и была причиной!
Re[2]: Один Синглетон живет, а другой - дохнет...
От: AGor  
Дата: 17.03.06 13:51
Оценка:
>>Вообще-то у бесконечноживуюих принято null возвращать в InitializeLifetimeService.

Хорошо пробую так:

public override object InitializeLifetimeService()
{ ILease lease = (ILease)base.InitializeLifetimeService();
if (lease.CurrentState == LeaseState.Initial)
{ /*lease.InitialLeaseTime = TimeSpan.Zero;*/ }
return тгдд; }

Та же ситуация. Null возвращает объект дохнет.


M>Поверь, ничего экзотического — чудес не бывает. 100-процентно где-то малюсенькая "фигня" (отличие) в коде. Перестань верить и убеждать самого себя, что всё "копи/пасте", давай "код — в студию"! Уверен, пока будешь писать сюда — обнаружишь разницу, и ту самую "подлую маленькую заразу", которая и была причиной!


Стопудно проверено. По одному шаблону делал.

Единственное различие кроется в самом режиме работы объектов.
Первый — выполняет работу по собственному таймеру и отсылает её серез евентсы калбаком. Может потому не убивает его CG потому что все время он работает.
Второй объект работает по требованию — ждет обращения, а оно может прийти и больше чем через 5 минут. Это единственное подозрение.

Так как ПРАВИЛЬНО синглетон бесконечноживущим сделать? Null тоже не прокатывает!
Re[3]: Один Синглетон живет, а другой - дохнет...
От: AGor  
Дата: 17.03.06 13:53
Оценка:
Ой — так:

public override object InitializeLifetimeService()
{ ILease lease = (ILease)base.InitializeLifetimeService();
if (lease.CurrentState == LeaseState.Initial)
{ /*lease.InitialLeaseTime = TimeSpan.Zero;*/ }
return null; }
Re[4]: Один Синглетон живет, а другой - дохнет...
От: maxluzin Европа  
Дата: 17.03.06 14:13
Оценка:
Здравствуйте, AGor, Вы писали:

AG>Ой — так:


Да? А может всё-таки не так?...
Re[5]: Один Синглетон живет, а другой - дохнет...
От: AGor  
Дата: 17.03.06 14:56
Оценка:
Здравствуйте, maxluzin, Вы писали:

M>Здравствуйте, AGor, Вы писали:


AG>>Ой — так:


M>Да? А может всё-таки не так?...


Ну не так, конечно. )

Вот Так:

public override object InitializeLifetimeService()
{ return null; }

Ну дак все равно дохнет! Чего делать-то, Подскажите плиз как его "завечнить"!
Re[6]: Один Синглетон живет, а другой - дохнет...
От: hugo Австрия  
Дата: 17.03.06 15:12
Оценка:
Здравствуйте, AGor, Вы писали:

AG>Ну дак все равно дохнет! Чего делать-то, Подскажите плиз как его "завечнить"!



public class EternalLife : MarhsalByRefObject, IEternalLife
{
   public override object InitializeLifetimeService()
   {
      return null;
   }
   
   static public EternalLife Instance
   {
      ....
   }
}

.........
RemotingServices.Marshal(EternalLife.Instance, "NeverDie", typeof(IEternalLife));
Re[7]: Один Синглетон живет, а другой - дохнет...
От: AGor  
Дата: 17.03.06 15:35
Оценка:
Здравствуйте, hugo, Вы писали:

H>
H>public class EternalLife : MarhsalByRefObject, IEternalLife
H>{
H>   public override object InitializeLifetimeService()
H>   {
H>      return null;
H>   }
   
H>   static public EternalLife Instance
H>   {
H>      ....
H>   }
H>}

H>.........
H>RemotingServices.Marshal(EternalLife.Instance, "NeverDie", typeof(IEternalLife));
H>


Буду очень благодарен за коментарий. Туммано как-то.

IEternalLife — что за интерфейс?

H>RemotingServices.Marshal(EternalLife.Instance, "NeverDie", typeof(IEternalLife));

Где Это конфигурируется — при резестрации WellKnownObjects на сервере? Дак я что там и объект должен создавать чтобыего инстан зарегестрировать?

Не воспринял ((((((((((
Re: Один Синглетон живет, а другой - дохнет...
От: Аноним  
Дата: 17.03.06 05:15
Оценка:
Имхо бесконечное время жизни не самое лучшое решение, хотя и простоя. ИМХО не поленитесь настройте вариант со спонсорами и будет вам счатье. Имейте в виду, что спонсоров тоже необходимо внешне декларировать, чтоб сервак их видел.
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[8]: Один Синглетон живет, а другой - дохнет...
От: Аноним  
Дата: 17.03.06 16:05
Оценка:
Здравствуйте, AGor, Вы писали:

AG>Здравствуйте, hugo, Вы писали:


H>>
H>>public class EternalLife : MarhsalByRefObject, IEternalLife
H>>{
H>>   public override object InitializeLifetimeService()
H>>   {
H>>      return null;
H>>   }
   
H>>   static public EternalLife Instance
H>>   {
H>>      ....
H>>   }
H>>}

H>>.........
H>>RemotingServices.Marshal(EternalLife.Instance, "NeverDie", typeof(IEternalLife));
H>>


AG>IEternalLife — что за интерфейс?


Твой интерфейс серверного объекта, который знает клиент


H>>RemotingServices.Marshal(EternalLife.Instance, "NeverDie", typeof(IEternalLife));

AG>Где Это конфигурируется — при резестрации WellKnownObjects на сервере? Дак я что там и объект должен создавать чтобыего инстан зарегестрировать?

EternalLife — тип серверного объекта, реализующий интерфейс IEternalLife. Регистрируется естественно на сервере.

static public EternalLife Instance
{
....
}
Реализация сингелтона, он и регистрируется.

AG>Не воспринял ((((((((((

MSDN рулит
Re[9]: Один Синглетон живет, а другой - дохнет...
От: AGor  
Дата: 17.03.06 17:19
Оценка:
Здравствуйте, Аноним, Вы писали:

H>>> static public EternalLife Instance

H>>> {
H>>> ....
H>>> }

А статик зачем?
И вот "Instance" новое для меня. Не могли бы вы пояснить? Спасибо большое!
Re[10]: Один Синглетон живет, а другой - дохнет...
От: AGor  
Дата: 18.03.06 13:42
Оценка:
Ну Господа!
Помогите уж пожалуста. Срочно надо. Почему настройки ЛайфТайма вообще в принципе могут не давать эффекта?

Что это за синтаксис:

H>>> static public EternalLife Instance

H>>> {
H>>> ....
H>>> }

(даже не компилится!)

и чем он может мне помоч?
Re[11]: Один Синглетон живет, а другой - дохнет...
От: Mab Россия http://shade.msu.ru/~mab
Дата: 18.03.06 18:39
Оценка:
Здравствуйте, AGor, Вы писали:

AG>Помогите уж пожалуста. Срочно надо.

Тебе уже сказали: приведи пример кода, воспроизводящего проблему.
Re[11]: Один Синглетон живет, а другой - дохнет...
От: Aen Sidhe Россия Просто блог
Дата: 19.03.06 07:59
Оценка:
Здравствуйте, AGor, Вы писали:

AG>Ну Господа!

AG>Помогите уж пожалуста. Срочно надо. Почему настройки ЛайфТайма вообще в принципе могут не давать эффекта?

AG>Что это за синтаксис:


H>>>> static public EternalLife Instance

H>>>> {
H>>>> ....
H>>>> }

AG>(даже не компилится!)


AG>и чем он может мне помоч?


Объясняю на пальцах.
1) Послушай тех, кто тебе помогает и приведи таки код.
2) У тебя есть какой-то класс, который выполняет работу. В данном примере он называется EternalLife — откуда человек знает, как он называется у тебя?
3) IEternalLife — интерфейс, который твои клиенты используют для работы и который реализован в EternalLife.
4) Рекомендую почитать классическую реализацию паттерна Singleton. Она примерно такова:

public class MySingleton
{
  private static MySingleton _instance = null;
  
  public static MySingleton Instance
  {
     get
     {
       if (_instance == null)
         _instance = new MySingleton();
 
       return _instance;
     }
  }
}


С дженериками он будет выглядеть немного по другому.
public class Singleton<SingletonClass> where SingletonClass : new()
{
  private static SingletonClass _instance = null;
  
  public static SingletonClass Instance
  {
     get
     {
       if (_instance == null)
         _instance = new SingletonClass();
 
       return _instance;
     }
  }
}
С уважением, Анатолий Попов.
ICQ: 995-908
Re: Гоблины играют траурный марш по сдохшему синглетону
От: Аноним  
Дата: 19.03.06 08:07
Оценка:
Re: Гоблины играют траурный марш по сдохшему синглетону
От: Аноним  
Дата: 19.03.06 08:46
Оценка:
Я долго ржал по поводу гоблинов

Может действительно не праить мозги а показать код. Либо пошарить на codeproject.com. Там был отличный приемер с ремотингом. К сожалению, я свой пример с работающим временем жизни похерил. И там никто не дох
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Гоблины играют траурный марш по сдохшему синглетону
От: Аноним  
Дата: 19.03.06 08:50
Оценка:
Если гоблины уже сыграли траурный марш, то можно функционал сдохшего синглтона запихнуть в первого. Ведь не зря он синглтон (то бишь единственный). Да и можно каналы разные открыть и все такое.
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Ответ которого ждал.... Эххх Радости нет....
От: AGor  
Дата: 19.03.06 12:52
Оценка:
Прекрасно понимаю, что для ответа на подобную ситуацию желательно видеть код.
Однако поясню почему его не вываливаю.

Во первых, признаться система у меня запутанная получилась. Движок ремотинга — какбы прост, но обслуживает многоступенчатую структуру аж в 70000 строк. Объекты синглетоны — нескольких видов (по функциональности реализуемых алгоритмов) и их может быть много! Уже несколько усложняет регистрацию на сервере. Это раз. Алгоритмы реализованы как плаги без имплементации как на клиенте так и на сервере — и подключаются по сетке созданием нового AppDoman. Два. У алгоритмов реализованно несколько интерфейсов (а не только IEternalLife). Три. Хост и активация тоже экзотические...
Получается, что вывалив здесь реальные части кода пришлось бы делать множество пояснений не относящихся непосредственно к проблеме умирания.

Во вторых мне бы хотелось получить в первую очередь теоретический ответ — почему в принципе это может быть. Серьёзный поиск "паттернов" уже проводил — и не находил ни одного с подобной структурой, пришлось все писать практически с теории. И вроде работает (за исключением таймлайфа).

Вообще-то я уже вороде бы понял в чем причина происходящего. И понял как раз благодаря вашим наводкам! Пришлось покапаься. Идеальный ответ на мой вопрос должен быть бы скорее всего таким (если я правильно понял):
---------
Дело в том, что на серваке у меня синглетоны регестрировались через RegisterWellKnownObject... А в этом случаи как выяснилось "активации" конструктора не происходит, и LifeTime не инициализируется. Чтобы он инициализировался — нужно именно сначала создавать Instance и потом регить RemotingServices.Marshal
---------
Но конечно без кода такой ответ получить было невозможно. Хотя теоритическая причина очевидна.

Вобщем всех очень благодарю за активную помошь! Благодаря наводкам нашел причину!

Теперь, блин, прийдеться как-то вкручивать RemotingServices.Marshal регистрацию в мою сруктуру... Учитывая то, что у меня объекты на сервере не имплементены — прийдеться думать как это сделать череё интерфейсы... Или вообще с нуля фабрику писать... Опять затраты времени, отодвигающие запуск пректа (((((

Может есть какой-нит способ установить LifeTime для синглетона после кативации GetObject на клиенте при регестрации его на сервере через RegisterWellKnownObject?
Получается уже новый вопрос.
Re[2]: Ответ которого ждал.... Эххх Радости нет....
От: Аноним  
Дата: 19.03.06 13:12
Оценка:
Есть. Я же говорил вам надо смотреть в сторону спонсоров. На клиенте регистрируются спонсоры, раздающие лиц на опр время жизни. Сервак знает о спонсорах и переодически опрашивает их.
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Ответ которого ждал.... Эххх Радости нет....
От: AGor  
Дата: 19.03.06 14:00
Оценка:
Здравствуйте, Димон, Вы писали:

Д>Есть. Я же говорил вам надо смотреть в сторону спонсоров. На клиенте регистрируются спонсоры, раздающие лиц на опр время жизни. Сервак знает о спонсорах и переодически опрашивает их.


Д>
данное сообщение получено с www.gotdotnet.ru

Д>ссылка на оригинальное сообщение


Да скорее всего прийдеться так. Уж очнь не хочеться структуру перелавывать работающую.
А вообще спонсор — что за зверь — отдельный сингтон? Какого типа объект может быть? И может ли он через интерфейсы с объектами работать? Может тутор какой-нить есть?

Спасибо.
Re[3]: Ответ которого ждал.... Эххх Радости нет....
От: Аноним  
Дата: 19.03.06 14:11
Оценка:
Эх жаль я примерчик потерял. ПОстараюсь нарыть.
На самом деле спонсорство это штатное средство. Ничего сложного, просто один затык с которым я долбился: спонсора обязательно объявлять (то бишь клиент становится сервером, а сервер — клиентом по отношению к спонсору). ИМХО возможно даже переделывать особо не придется может наследуетесь или переопределите механизм времени жизни.
Постараюсь чонить нарыть...
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Ответ которого ждал.... Эххх Радости нет....
От: Аноним  
Дата: 19.03.06 14:17
Оценка:
Копать Вам нужно в сторону ISponsor, а механизм называется механизм аренды. ПОсле того как в нем разберешься, бесконечное время жизни кажется варварством.
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Ответ которого ждал.... Эххх Радости нет....
От: Аноним  
Дата: 19.03.06 14:23
Оценка:
гляньте здесь
http://www.codeproject.com/csharp/dotnetremotingbasictutor.asp

http://www.codeproject.com/csharp/remoteobj2.asp

http://www.codeproject.com/vb/net/Remoting_HelloWorld.asp
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Ответ которого ждал.... Эххх Радости нет....
От: AGor  
Дата: 19.03.06 17:14
Оценка:
Здравствуйте, Димон,

Большое спасибо за внимание!

Буду пробовать сейчас...

Вариант с RSDN:
--------
Ничего сложного, просто один затык с которым я долбился: спонсора обязательно объявлять (то бишь клиент становится сервером, а сервер — клиентом по отношению к спонсору).
--------

Вариант с GotDotNet.ru
--------
Ничего сложного, просто один затык с которым я долбился: спонсора обязательно объявлять внешне (т.е в конфиг файле) (то бишь клиент становится сервером, а сервер — клиентом по отношению к спонсору
--------

Второй признаться настораживает. "внешне (т.е в конфиг файле)" Что конфигурационый файл обязательно? У меня весь ремотинг программно конфигурируется. Видите ли у меня локальная мультисерверная система. Клиент один — серверов много, и мне как-то показалось, что бес конфиг-файлов удобнее. Заработает ли при программном конфигурировании?


ПС Проблемы у меня с GotDotNet — пароль забыл, а он на почтовый ящик не отсылает — раз 100 пробовал получить — не отсылает. У вас такоебыло?
Re: По пунктам с кодом
От: AGor  
Дата: 20.03.06 08:05
Оценка:
Итак по пунктам. Почти один к одному с MSDN.

1. Создаю класс спонсора и сую его в dll видимую как на клиенте, так на плагах и на сервере. Создаю по MSDN:
----------------

public class PlugSponsor : MarshalByRefObject, ISponsor
{
private DateTime lastRenewal;
public PlugSponsor()
{ lastRenewal = DateTime.Now; }
public TimeSpan Renewal(ILease lease)
{ lastRenewal = DateTime.Now;
return TimeSpan.FromSeconds(20); } }

----------------

2. В каждом плате перегружаю:

----------------

public override object InitializeLifetimeService()
{ ILease lease = (ILease)base.InitializeLifetimeService();
if (lease.CurrentState == LeaseState.Initial)
{ lease.InitialLeaseTime = TimeSpan.FromSeconds(3);
lease.SponsorshipTimeout = TimeSpan.FromSeconds(10);
lease.RenewOnCallTime = TimeSpan.FromSeconds(2); }
return lease; }

----------------

3. На сервере регистрирую плаги с объектами так:

----------------

foreach (APLG plug in this.plugsLoader.ArrayOfAvailablePlugs)
{ System.Type plugType = plug.Instance.GetType();
string plugUri = plug.Instance.Plug.PlugNick;
RemotingConfiguration.RegisterWellKnownServiceType(plugType,plug.Instance.Plug.PlugNick,WellKnownObjectMode.Singleton); }

----------------

4. На клиенте создаю спонсора (либо для каждого запуска своего — эффект один):

----------------

private TE.UNITS.PlugSponsor plugSponsor = new PlugSponsor();

----------------

5. На кленте активирую плаг так:

----------------

objectUrl = "tcp://" + setera.ERM + ":" + this.station.RemotePort + "/" + setera.ERA;
era = (IERA)Activator.GetObject(typeof(IERA),objectUrl);
if (era != null)
{ era.unitEvent += new UnitEvent(this.unitEventReceiver.UnitEventHandler);
//--- Set sponsor ---
ILease plugLease = (ILease)RemotingServices.GetLifetimeService((MarshalByRefObject)era);
plugLease.Register(this.plugSponsor);
//-------------------
success = true; }

--------

"era" плаг запускается, но если к нему больше 5 минут не обращаешся все равно дохнет или там отключается через 5 мин! При обращении выдает ошибку:

------------
An unhandled exception of type 'System.Runtime.Remoting.RemotingException' occurred in mscorlib.dll

Additional information: Object </d03c6feb_383b_48d2_ad82_df69fe75abcd/RIeV_yzcG_6QauqQIPTk9_z2_11.rem> has been disconnected or does not exist at the server.
------------

Спонсор не меняет аренду. Хотя и назначен.

Какие манипуляции нужно сделать, чтоб давал?
Как посмотреть какой объект именно сдох (может и не тот объект? не era?)
Re[4]: Ответ которого ждал.... Эххх Радости нет....
От: Аноним  
Дата: 20.03.06 03:58
Оценка:
>Второй признаться настораживает. "внешне (т.е в конфиг файле)" Что конфигурационый файл обязательно? У меня весь ремотинг программно конфигурируется. Видите ли у меня локальная мультисерверная система. Клиент один — серверов много, и мне как-то показалось, что бес конфиг-файлов удобнее. Заработает ли при программном конфигурировании?<
Чот глюки на гдн в выходные. Я исправил сообщение, а оно поползло. Если вы не пользуетесь конфигом дела сильно не меняет, смысл один надо спонсора внешне объявлять (забыл термин, типа хорошо известные объекты, кроче welknown), приходится на пальцах, тк щас не решусь все это восстановить.
>ПС Проблемы у меня с GotDotNet — пароль забыл, а он на почтовый ящик не отсылает — раз 100 пробовал получить — не отсылает. У вас такоебыло?<
У меня были замороки, но както выкрутился. Там раньше мраки были с паспортом, благо щас по паролю сделали. Кроче как то я пароль восстановил, там он у них какой-то мрачный (бракозябры какие-то), исправил на нормальный и щас нет проблем, тем более оперой пользуюсь, автоматом входит. Правда гдн, как и мс оперу за браузер не считает, поэтому форматирование никакое
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: По пунктам с кодом
От: Аноним  
Дата: 20.03.06 09:06
Оценка:
У меня были такие же грабли. Я об этом грил. Правда я делал с конфиг файлами. Если мне не изменяет память спонсора нужно не просто инициал конструктором, а как и плаги ваши RemotingConfiguration.RegisterWellKnownServiceType ... Могу заблуждаться, но имхо так.
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: По пунктам с кодом
От: Аноним  
Дата: 20.03.06 09:07
Оценка:
Кроче сервак просто не видит вашего спонсора, поэтому он не продлевает время жизни клиента.
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.