Рабочий процесс Sharepoint не работает после обновления решения

У меня есть работающий рабочий процесс, в котором используются действия Parallell и OnTaskCreated. Решение было развернуто на нескольких клиентах, недавно я работал над обновлением, которое требовало замены сборки рабочего процесса. Когда я выполнял обновление, у меня было несколько запущенных экземпляров рабочего процесса на сервере.

С тех пор ничего не работает, я не могу нормально завершить новый рабочий процесс. Я всегда получаю вот эту ошибку:

01/14/2010 16:14:33.73  w3wp.exe (0x1928)                           0x2514  Windows SharePoint Services     Workflow Infrastructure         936l    High        Engine RunWorkflow: System.Workflow.Activities.EventDeliveryFailedException: Event "OnTaskChanged" on interface type "Microsoft.SharePoint.Workflow.ITaskService" for instance id "7697ee64-7286-46f3-992e-cf3c18731f15" cannot be delivered. ---> System.NullReferenceException: Object reference not set to an instance of an object.     at Microsoft.SharePoint.Workflow.SPWorkflowHostServiceBase.LoadInstanceData(Guid instanceId, Boolean& compressedData)     at Microsoft.SharePoint.Workflow.SPWinOePersistenceService.LoadWorkflowInstanceState(Guid instanceId)     at System.Workflow.Runtime.WorkflowRuntime.InitializeExecutor(Guid instanceId, CreationContext context, WorkflowExecutor executor, WorkflowInstance workflowInstance)     at System.Workflow.Runtime.WorkflowRuntime.Load(Guid key, CreationCont...  
01/14/2010 16:14:33.73* w3wp.exe (0x1928)                           0x2514  Windows SharePoint Services     Workflow Infrastructure         936l    High        ...ext context, WorkflowInstance workflowInstance)     at System.Workflow.Runtime.WorkflowRuntime.GetWorkflow(Guid instanceId)     at System.Workflow.Activities.WorkflowMessageEventHandler.EventHandler(Object sender, ExternalDataEventArgs eventArgs)     --- End of inner exception stack trace ---     at System.Workflow.Activities.WorkflowMessageEventHandler.EventHandler(Object sender, ExternalDataEventArgs eventArgs)     at Microsoft.SharePoint.Workflow.SPWinOETaskService.RaiseEvent(SPWinOeWorkflow workflow, SPWorkflowEvent workflowEvent, Object workItem, IPendingWork workHandler)     at Microsoft.SharePoint.Workflow.SPWinOeHostServices.Send(SPWinOeWorkflow winoeworkflow, SPWorkflowEvent e)     at Microsoft.SharePoint.Workflow.SPWinOeEngine.RunWorkflow(Guid trackingId, SPWorkflowHostService ho...   
01/14/2010 16:14:33.73* w3wp.exe (0x1928)                           0x2514  Windows SharePoint Services     Workflow Infrastructure         936l    High        ...st, SPWorkflow workflow, Collection`1 events, TimeSpan timeOut)   

Я искал проблему в Google и нашел несколько решений, в которых люди советуют завершить все экземпляры рабочего процесса до того, как будет выполнено обновление. На мой взгляд, это решение неприемлемо, потому что у меня могло быть неуправляемое количество запущенных рабочих процессов.

Мне было интересно, может ли это быть связано с хостом рабочего процесса Sharepoint, могу ли я программно завершить все работающие рабочие процессы во время обновления?

Есть ли у кого-нибудь идеи, как я могу решить эту проблему?


person armannvg    schedule 14.01.2010    source источник


Ответы (1)


Вам следовало бы послушать этих людей или, по крайней мере, выяснить для себя, почему они говорят такие вещи. Они правы, и теперь вы знаете, почему; вы эффективно испортили все свои рабочие процессы.

SharePoint сериализует двоичный рабочий процесс в базу данных, когда рабочий процесс неактивен / простаивает и / или ожидает события. Если вы замените сборку, когда она находится в спящем / сериализованном состоянии, когда инфраструктура хостинга WF в sharepoint пытается десериализовать рабочий процесс, чтобы оживить его, произойдет сбой, потому что целевой тип изменился (потому что вы «обновили» его).

НЕТ простого способа обновить двоичные рабочие процессы в sharepoint; «бок о бок» - единственный способ сделать это. Вы увеличиваете версию сборки, создаете новую ассоциацию WF и устанавливаете старые ассоциации wrkflow, чтобы они перестали принимать новые запросы. Старые рабочие процессы будут дополнены старым кодом, а новые рабочие процессы будут использовать ваш новый код. Другого пути нет, извините.

-Oisin

person x0n    schedule 16.01.2010
comment
Спасибо за ответ, я изменил версию сборки с 1.1.0.0 до 1.1.1.0, может быть, хост рабочего процесса использует только основные или второстепенные версии и, следовательно, думает, что я все еще использую ту же версию? Что для меня странно, так это то, что я не могу нормально завершить новые рабочие процессы. - person armannvg; 18.01.2010
comment
Я предполагаю, что у вас есть оба двоичных файла рабочего процесса в GAC, и вы создали новую ассоциацию рабочего процесса и функцию (не заменили старые?) МОЙ плохо, что не упомянул, что вы должны создать новую функцию, чтобы все было отдельно - многие люди включают версию в имя функции, например рабочий процесс 1.2 - person x0n; 18.01.2010
comment
Нет, я не создавал новую функцию. Я обновил только версию nr. для сборки рабочего процесса, а затем изменил файл workflow.xml, чтобы синхронизировать номер версии. Сама ассоциация рабочего процесса настраивается в обработчике событий в моем коде, и я ничего там не менял. Еще один вопрос :) Я удалил веб-приложение, в котором возникла эта ошибка (не содержало никаких данных, так что все в порядке), затем создал новое веб-приложение и по-прежнему получаю ту же ошибку. Сохраняется ли какая-то информация о типе рабочего процесса в базе данных конфигурации? - person armannvg; 18.01.2010
comment
Не забудьте также перезапустить службу SPTimerV3 (каждый раз при развертывании и т. Д.) - у нее также будет копия сборки вашего рабочего процесса, загруженная в память. И да, многое сохраняется в базе данных - ваше основное правило должно заключаться в том, что обновления рабочего процесса на самом деле являются полностью новым рабочим процессом, идущим бок о бок со старым. - person x0n; 18.01.2010
comment
Мне нужно создать новую функцию? Я создал новый рабочий процесс в workflow.xml, присвоил ему новый guid и обновил код, который связывает рабочий процесс, поэтому он использует новую версию, но все равно безуспешно. Рабочий процесс все еще продолжается, есть идеи? Я перезапустил службу таймера и IIS - person armannvg; 21.01.2010
comment
Спасибо за помощь X0n. Я еще не до конца разобрался в этом и напишу дело в Microsoft по поводу этой проблемы. Если получу ответ, выложу здесь :) - person armannvg; 23.01.2010