private void ProcessFeed(DataFeed dataFeed)
        {
            VkGroup        group     = this.groupRepository.GetGroupById(dataFeed.VkGroupId);
            IFeedProcessor processor = this.processorFactory.Create(dataFeed.Type);

            using (var transaction = this.transactionProvider.CreateTransaction().Begin())
            {
                this.log.InfoFormat("Processing data feed with VkGroupId={0} ({1}) is started", dataFeed.VkGroupId, dataFeed.Type);

                try
                {
                    processor.Process(dataFeed, group);
                    transaction.Commit();
                    this.log.InfoFormat("Processing data feed with VkGroupId={0} ({1}) is finished", dataFeed.VkGroupId, dataFeed.Type);
                }
                catch (Exception exc)
                {
                    transaction.Rollback();
                    this.log.ErrorFormat("Data feed with VkGroupId={0} ({1}) is failed to be processed. Reason: {2}", dataFeed.VkGroupId, dataFeed.Type, exc.ToString());
                    throw;
                }
                finally
                {
                    dataFeed.MarkAsCompleted();
                    this.log.InfoFormat("Data feed with Id={0} ({1}) is deleted", dataFeed.VkGroupId, dataFeed.Type);
                }
            }
        }
        private void ProcessTerminator(DataFeed dataFeed)
        {
            VkGroupProcessingHistoryItem item = new VkGroupProcessingHistoryItem
            {
                FeedType          = dataFeed.Type,
                VkGroupId         = dataFeed.VkGroupId,
                FetchingDate      = dataFeed.SendingDate,
                FetchingServer    = dataFeed.FetchingServer,
                FetchingProcess   = dataFeed.FetchingProcess,
                ProcessingDate    = this.dateTimeHelper.GetDateTimeNow(),
                ProcessingServer  = this.webUtilities.GetServerName(),
                ProcessingProcess = this.webUtilities.GetApplicationPoolName()
            };

            using (var transaction = this.transactionProvider.CreateTransaction().Begin())
            {
                try
                {
                    int version = this.groupRepository.SaveGroupProcessingHistoryItem(item);
                    transaction.Commit();

                    IFeedProcessor processor = this.processorFactory.Create(dataFeed.Type);
                    processor.ProcessTerminator(dataFeed.VkGroupId, version);
                }
                catch (Exception exc)
                {
                    transaction.Rollback();
                    this.log.ErrorFormat("Terminator feed with VkGroupId={0} ({1}) is failed to be processed. Reason: {2}", dataFeed.VkGroupId, dataFeed.Type, exc.ToString());
                    throw;
                }
                finally
                {
                    dataFeed.MarkAsCompleted();
                }
            }
        }