Возобновление системных заданий
«Зависшие» в ожидании системные задания можно повторно отправить на отработку. Но если их тысячи, то ручная реанимация может занять продолжительное время. Поэтому для автоматизации, можно воспользоваться консольным приложением:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Client; using System.ServiceModel; using System.ServiceModel.Description; using System.Runtime.Serialization; namespace RestoreSystemJob { class Program { static void Main(string[] args) { // Подключаемся к CRM ClientCredentials credentials = new ClientCredentials(); credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2011"); Uri uri = new Uri("http://crm2011:5555/superfirma/XRMServices/2011/Organization.svc"); OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null); proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior()); IOrganizationService service = (IOrganizationService)proxy; try { QueryExpression query = new QueryExpression("asyncoperation"); // Готовим запрос для возвращения "застрявших" системных заданий ColumnSet cols = new ColumnSet(new string[] { "asyncoperationid", "statecode", "statuscode" }); ConditionExpression c1 = new ConditionExpression("statecode", ConditionOperator.Equal, 1); // Приостановлено ConditionExpression c2 = new ConditionExpression("statuscode", ConditionOperator.Equal, 10); // Ожидание FilterExpression filter = new FilterExpression(); filter.FilterOperator = LogicalOperator.And; filter.AddCondition(c1); filter.AddCondition(c2); query.ColumnSet = cols; query.Criteria.AddFilter(filter); // Возвращаем ожиадющие записи системных заданий EntityCollection colResults = service.RetrieveMultiple(query); foreach (Entity async in colResults.Entities) { Entity e = async; // Меняем Состояние и Статус системного задания e["statecode"] = new OptionSetValue(0); // Готово e["statuscode"] = new OptionSetValue(0); // Ожидание ресурсов // Обновляем запись service.Update(e); } Console.WriteLine("Processed records: " + colResults.TotalRecordCount); Console.WriteLine("\nPress <Enter> to exit."); Console.ReadLine(); } catch (Exception ex) { throw new Exception("Error:", ex); } } } }
Тут мы сначала запрашиваем зависшие системные задания и обновляем их статус на ожидание ресурсов, чтобы система подхватила их начала над ними трудится.
Добрый день, а для какой версии решение? 2011 или 2013?
Здрасьте 🙂
Эксперимент проводил на CRM 2011, но для 2013 версии вряд ли что то изменилось
Спасибо огромное за отличную фичу)