Один Синглетон живет, а другой - дохнет...
От: 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
ссылка на оригинальное сообщение
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.