Гость
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Удаление экземпляра WCF сервиса в режиме PerCall / 6 сообщений из 6, страница 1 из 1
23.09.2013, 12:14
    #38404512
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление экземпляра WCF сервиса в режиме PerCall
Всем добрый день.

Есть WCF сервис с поведением InstanceContextMode = InstanceContextMode.Percall,
причём методы сервиса часто выполняются достаточно долго по объективным причинам.
Иногда нужно остановить какой-то экземпляр сервиса.
Есть ли возможность идентификации и удаления отдельных экземпляров сервиса?
...
Рейтинг: 0 / 0
24.09.2013, 12:12
    #38405785
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление экземпляра WCF сервиса в режиме PerCall
JovannyВсем добрый день.

Есть WCF сервис с поведением InstanceContextMode = InstanceContextMode.Percall,
причём методы сервиса часто выполняются достаточно долго по объективным причинам.
Иногда нужно остановить какой-то экземпляр сервиса.
Есть ли возможность идентификации и удаления отдельных экземпляров сервиса?
с клиента? или обзервер, который будет их убивать?
...
Рейтинг: 0 / 0
25.09.2013, 08:46
    #38406756
EDUARD SAPOTSKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление экземпляра WCF сервиса в режиме PerCall
Вариантов решения этой задачи много, но имхо самый надежный - через БД. Создаете таблицу примерно с такой структурой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE [dbo].[WorkFlowsControl](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[FlowId] [uniqueidentifier] NOT NULL, -- GUID сервиса
	[StartDate] [datetime] NOT NULL, -- Когда сервис стартовал
	[FinishDate] [datetime] NULL, -- Когда завершил работу
	[LastResponse] [datetime] NULL, -- Когда подавал последние признаки жизни
	[FlowState] [int] NOT NULL, -- Состояние сервиса. Например: 0 - работает, 1 - завершил работу, 2 - умер, 3 - убит юзером...
	[KillFlow] [bit] NOT NULL, -- флаг того что нужно убить сервис
 CONSTRAINT [PK_WorkFlowsControl] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_StartDate]  DEFAULT (getdate()) FOR [StartDate]
GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_State]  DEFAULT ((0)) FOR [FlowState]
GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_KillService]  DEFAULT ((0)) FOR [KillFlow]
GO



Когда сервис стартовал, генерите в нем гуид и инсертите запись в таблицу. Время от времени(например по таймеру)
сервис мониторит таблицу, делает в ней записи о своем состоянии и считывает поле - KillFlow, если true - сам себя убивает.
С какого-то клиента мониторите эту таблицу и видите что у Вас происходит. Если нужно убить сервис ставите KillFlow в true.
Можно обойтись и без БД, например создать еще один сервис с колекцией объектов аналогичной структуры как в приведенной таблице,
и повесить этот сервис как сингл, другие сервисы будут обращаться к этому синглу и делать аналогичные операци. Но здесь есть
одна проблема, синглы имеют неприятную особенность временами падать, особенно если система висит на общественном хостинге, например
рестартонул IIS, в этом случае хрен знает в каком состоянии все умерло.
Вообще если у Вас длительные процессы, то рекомендую посмотреть в сторону Work Flow + WCF, там вышеприведенные механизмы(сохранение состояния в БД)
уже реализованы по дефолту.
...
Рейтинг: 0 / 0
25.09.2013, 12:38
    #38407067
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление экземпляра WCF сервиса в режиме PerCall
EDUARD SAPOTSKIВариантов решения этой задачи много, но имхо самый надежный - через БД. Создаете таблицу примерно с такой структурой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE [dbo].[WorkFlowsControl](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[FlowId] [uniqueidentifier] NOT NULL, -- GUID сервиса
	[StartDate] [datetime] NOT NULL, -- Когда сервис стартовал
	[FinishDate] [datetime] NULL, -- Когда завершил работу
	[LastResponse] [datetime] NULL, -- Когда подавал последние признаки жизни
	[FlowState] [int] NOT NULL, -- Состояние сервиса. Например: 0 - работает, 1 - завершил работу, 2 - умер, 3 - убит юзером...
	[KillFlow] [bit] NOT NULL, -- флаг того что нужно убить сервис
 CONSTRAINT [PK_WorkFlowsControl] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_StartDate]  DEFAULT (getdate()) FOR [StartDate]
GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_State]  DEFAULT ((0)) FOR [FlowState]
GO

ALTER TABLE [dbo].[WorkFlowsControl] 
ADD  CONSTRAINT [DF_WorkFlowsControl_KillService]  DEFAULT ((0)) FOR [KillFlow]
GO



Когда сервис стартовал, генерите в нем гуид и инсертите запись в таблицу. Время от времени(например по таймеру)
сервис мониторит таблицу, делает в ней записи о своем состоянии и считывает поле - KillFlow, если true - сам себя убивает.
С какого-то клиента мониторите эту таблицу и видите что у Вас происходит. Если нужно убить сервис ставите KillFlow в true.
Можно обойтись и без БД, например создать еще один сервис с колекцией объектов аналогичной структуры как в приведенной таблице,
и повесить этот сервис как сингл, другие сервисы будут обращаться к этому синглу и делать аналогичные операци. Но здесь есть
одна проблема, синглы имеют неприятную особенность временами падать, особенно если система висит на общественном хостинге, например
рестартонул IIS, в этом случае хрен знает в каком состоянии все умерло.
Вообще если у Вас длительные процессы, то рекомендую посмотреть в сторону Work Flow + WCF, там вышеприведенные механизмы(сохранение состояния в БД)
уже реализованы по дефолту.
как сервис себя убьет? В логику некий флаг вставлять do while ( ) ?
...
Рейтинг: 0 / 0
25.09.2013, 12:52
    #38407085
EDUARD SAPOTSKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление экземпляра WCF сервиса в режиме PerCall
netivanкак сервис себя убьет? В логику некий флаг вставлять do while ( ) ?
Ну я хз как у ТС сервис реализован и что он делает, но в общем случае нужно выполнение метода завершить через return, как это сделать это уже дело конкретной реализации.
...
Рейтинг: 0 / 0
16.10.2013, 14:36
    #38429720
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление экземпляра WCF сервиса в режиме PerCall
EDUARD SAPOTSKI,

Извините за долгое молчание, отвлекли на другие задачи.
Спасибо, то, что нужно.
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Удаление экземпляра WCF сервиса в режиме PerCall / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]