Уже все наладил, практически со всем разобрался — а тут опять...
В кратце странность такая. Есть два разный объекта — одинаково зарегестирированны как Синглетоны, один порт, разные ури, лайфтайм прописан одинаково — бесконечноживущие:
Тобишь вся конфигурация ремотинга под них по принципу Copy-Paste. Близнецы.
Запускаю первый — работает как часы. Через некоторое время — запускаю второй работает. Но через некоторое всемя — дохнет (при обращении к методу — RemotingException — "Объект XXXX либо, мол не существует либо дисконнектед"). А первый — нормально...
Как так? Что-то экзотическое? Почему ЛайфТайм не ставится у второго?
Может у кого-то были подобные сложности?
Здравствуйте, AGor, Вы писали:
AG>Ох ужж ентот ремотинг, Господа!
AG>Уже все наладил, практически со всем разобрался — а тут опять... AG>В кратце странность такая. Есть два разный объекта — одинаково зарегестирированны как Синглетоны, один порт, разные ури, лайфтайм прописан одинаково — бесконечноживущие:
Вообще-то у бесконечноживуюих принято null возвращать в InitializeLifetimeService.
Здравствуйте, AGor, Вы писали:
AG>Ох ужж ентот ремотинг, Господа!
AG>Как так? Что-то экзотическое? Почему ЛайфТайм не ставится у второго? AG>Может у кого-то были подобные сложности?
Поверь, ничего экзотического — чудес не бывает. 100-процентно где-то малюсенькая "фигня" (отличие) в коде. Перестань верить и убеждать самого себя, что всё "копи/пасте", давай "код — в студию"! Уверен, пока будешь писать сюда — обнаружишь разницу, и ту самую "подлую маленькую заразу", которая и была причиной!
M>Поверь, ничего экзотического — чудес не бывает. 100-процентно где-то малюсенькая "фигня" (отличие) в коде. Перестань верить и убеждать самого себя, что всё "копи/пасте", давай "код — в студию"! Уверен, пока будешь писать сюда — обнаружишь разницу, и ту самую "подлую маленькую заразу", которая и была причиной!
Стопудно проверено. По одному шаблону делал.
Единственное различие кроется в самом режиме работы объектов.
Первый — выполняет работу по собственному таймеру и отсылает её серез евентсы калбаком. Может потому не убивает его CG потому что все время он работает.
Второй объект работает по требованию — ждет обращения, а оно может прийти и больше чем через 5 минут. Это единственное подозрение.
Так как ПРАВИЛЬНО синглетон бесконечноживущим сделать? Null тоже не прокатывает!
Буду очень благодарен за коментарий. Туммано как-то.
IEternalLife — что за интерфейс?
H>RemotingServices.Marshal(EternalLife.Instance, "NeverDie", typeof(IEternalLife));
Где Это конфигурируется — при резестрации WellKnownObjects на сервере? Дак я что там и объект должен создавать чтобыего инстан зарегестрировать?
Не воспринял ((((((((((
Re: Один Синглетон живет, а другой - дохнет...
От:
Аноним
Дата:
17.03.06 05:15
Оценка:
Имхо бесконечное время жизни не самое лучшое решение, хотя и простоя. ИМХО не поленитесь настройте вариант со спонсорами и будет вам счатье. Имейте в виду, что спонсоров тоже необходимо внешне декларировать, чтоб сервак их видел.
Твой интерфейс серверного объекта, который знает клиент
H>>RemotingServices.Marshal(EternalLife.Instance, "NeverDie", typeof(IEternalLife)); AG>Где Это конфигурируется — при резестрации WellKnownObjects на сервере? Дак я что там и объект должен создавать чтобыего инстан зарегестрировать?
EternalLife — тип серверного объекта, реализующий интерфейс IEternalLife. Регистрируется естественно на сервере.
static public EternalLife Instance
{
....
}
Реализация сингелтона, он и регистрируется.
AG>Не воспринял ((((((((((
MSDN рулит
Здравствуйте, 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. Там был отличный приемер с ремотингом. К сожалению, я свой пример с работающим временем жизни похерил. И там никто не дох
Re: Гоблины играют траурный марш по сдохшему синглетону
От:
Аноним
Дата:
19.03.06 08:50
Оценка:
Если гоблины уже сыграли траурный марш, то можно функционал сдохшего синглтона запихнуть в первого. Ведь не зря он синглтон (то бишь единственный). Да и можно каналы разные открыть и все такое.
Прекрасно понимаю, что для ответа на подобную ситуацию желательно видеть код.
Однако поясню почему его не вываливаю.
Во первых, признаться система у меня запутанная получилась. Движок ремотинга — какбы прост, но обслуживает многоступенчатую структуру аж в 70000 строк. Объекты синглетоны — нескольких видов (по функциональности реализуемых алгоритмов) и их может быть много! Уже несколько усложняет регистрацию на сервере. Это раз. Алгоритмы реализованы как плаги без имплементации как на клиенте так и на сервере — и подключаются по сетке созданием нового AppDoman. Два. У алгоритмов реализованно несколько интерфейсов (а не только IEternalLife). Три. Хост и активация тоже экзотические...
Получается, что вывалив здесь реальные части кода пришлось бы делать множество пояснений не относящихся непосредственно к проблеме умирания.
Во вторых мне бы хотелось получить в первую очередь теоретический ответ — почему в принципе это может быть. Серьёзный поиск "паттернов" уже проводил — и не находил ни одного с подобной структурой, пришлось все писать практически с теории. И вроде работает (за исключением таймлайфа).
Вообще-то я уже вороде бы понял в чем причина происходящего. И понял как раз благодаря вашим наводкам! Пришлось покапаься. Идеальный ответ на мой вопрос должен быть бы скорее всего таким (если я правильно понял):
---------
Дело в том, что на серваке у меня синглетоны регестрировались через RegisterWellKnownObject... А в этом случаи как выяснилось "активации" конструктора не происходит, и LifeTime не инициализируется. Чтобы он инициализировался — нужно именно сначала создавать Instance и потом регить RemotingServices.Marshal
---------
Но конечно без кода такой ответ получить было невозможно. Хотя теоритическая причина очевидна.
Вобщем всех очень благодарю за активную помошь! Благодаря наводкам нашел причину!
Теперь, блин, прийдеться как-то вкручивать RemotingServices.Marshal регистрацию в мою сруктуру... Учитывая то, что у меня объекты на сервере не имплементены — прийдеться думать как это сделать череё интерфейсы... Или вообще с нуля фабрику писать... Опять затраты времени, отодвигающие запуск пректа (((((
Может есть какой-нит способ установить LifeTime для синглетона после кативации GetObject на клиенте при регестрации его на сервере через RegisterWellKnownObject?
Получается уже новый вопрос.
Re[2]: Ответ которого ждал.... Эххх Радости нет....
От:
Аноним
Дата:
19.03.06 13:12
Оценка:
Есть. Я же говорил вам надо смотреть в сторону спонсоров. На клиенте регистрируются спонсоры, раздающие лиц на опр время жизни. Сервак знает о спонсорах и переодически опрашивает их.