Разработка
13
Апр
3

Возобновление системных заданий

«Зависшие» в ожидании системные задания можно повторно отправить на отработку. Но если их тысячи, то ручная реанимация может занять продолжительное время. Поэтому для автоматизации, можно воспользоваться консольным приложением:

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); 
            }
        }
    }
}

Тут мы сначала запрашиваем зависшие системные задания и обновляем их статус на ожидание ресурсов, чтобы система подхватила их начала над ними трудится.


Комментарии (3)
  • Макс 13.04.2013

    Добрый день, а для какой версии решение? 2011 или 2013?

  • slivka_83 13.04.2013

    Здрасьте 🙂
    Эксперимент проводил на CRM 2011, но для 2013 версии вряд ли что то изменилось

  • Макс 13.04.2013

    Спасибо огромное за отличную фичу)

*

code