예제 #1
0
 public void Fail(PersistentQueueItem <T> item)
 {
     Guard.ArgumentNotNull <PersistentQueueItem <T> >(item);
     Guard.ArgumentPositive(item.Id);
     this.FailImpl(item);
     Interlocked.Increment(ref this.count);
 }
예제 #2
0
 public void Save(PersistentQueueItem <T> item)
 {
     this.MultiSave(new PersistentQueueItem <T>[]
     {
         item
     });
 }
예제 #3
0
        protected override List <PersistentQueueItem <T> > MultiLoadImpl(int batch)
        {
            List <PersistentQueueItem <T> > result = new List <PersistentQueueItem <T> >(batch);

            using (EfzConnection connection = new EfzConnection(this.connString))
            {
                EfzCommand command = connection.CreateCommand();
                command.CommandText = "select top " + batch + " Id, Payload, EnqueueTime, Priority, Try from QueueItems where State = 0 order by Priority";
                connection.Open();
                using (EfzDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        result.Add(PersistentQueueItem <T> .FromDataReader(reader));
                    }
                }
                if (result.Count > 0)
                {
                    StringBuilder ids = new StringBuilder(result[0].Id.ToString());
                    for (int i = 1; i < result.Count; i++)
                    {
                        ids.Append(",");
                        ids.Append(result[i].Id);
                    }
                    command.CommandText = "update QueueItems set State = 1 where Id in (" + ids.ToString() + ");";
                    command.ExecuteNonQuery();
                }
            }
            return(result);
        }
예제 #4
0
 protected override void FailImpl(PersistentQueueItem <T> item)
 {
     using (EfzConnection connection = new EfzConnection(this.connString))
     {
         EfzCommand command = connection.CreateCommand();
         command.CommandText = string.Format("update QueueItems set Priority = {0}, Try = {1}, State = 0 where Id = {2}", item.Priority, item.Try, item.Id);
         connection.Open();
         command.ExecuteNonQuery();
     }
 }
예제 #5
0
 protected override void RemoveImpl(PersistentQueueItem <T> item)
 {
     using (EfzConnection connection = new EfzConnection(this.connString))
     {
         EfzCommand command = connection.CreateCommand();
         command.CommandText = "delete from QueueItems where Id = " + item.Id;
         connection.Open();
         command.ExecuteNonQuery();
     }
 }
예제 #6
0
 protected override void DiscardImpl(PersistentQueueItem <T> item)
 {
     using (EfzConnection connection = new EfzConnection(this.connString))
     {
         string     sql     = string.Format("delete from QueueItems where Id = {0}; insert into DiscardQueueItems(Id, Payload, EnqueueTime) values({0}, '{1}', '{2}');", item.Id, item.PayloadToJson(), item.EnqueueTime.ToString("yyyy-MM-dd HH:mm:ss"));
         EfzCommand command = connection.CreateCommand();
         command.CommandText = sql;
         connection.Open();
         command.ExecuteNonQuery();
     }
 }
예제 #7
0
 public static PersistentQueueItem <T> FromDataReader(IDataReader reader)
 {
     Guard.ArgumentNotNull <IDataReader>(reader);
     return(new PersistentQueueItem <T>
     {
         Id = (int)reader["Id"],
         EnqueueTime = (DateTime)reader["EnqueueTime"],
         Priority = (long)reader["Priority"],
         Try = (int)reader["Try"],
         Payload = PersistentQueueItem <T> .PayloadFromJson((string)reader["Payload"])
     });
 }
예제 #8
0
 protected override void MultiSaveImpl(params PersistentQueueItem <T>[] items)
 {
     using (EfzConnection connection = new EfzConnection(this.connString))
     {
         StringBuilder sql = new StringBuilder();
         for (int i = 0; i < items.Length; i++)
         {
             PersistentQueueItem <T> item = items[i];
             sql.Append(string.Format("insert into QueueItems(Payload, EnqueueTime, Priority, Try, State) values('{0}', '{1}', {2}, 0, 0);", item.PayloadToJson().Replace("'", "''"), item.EnqueueTime.ToString("yyyy-MM-dd HH:mm:ss"), item.Priority));
         }
         EfzCommand command = connection.CreateCommand();
         command.CommandText = sql.ToString();
         connection.Open();
         command.ExecuteNonQuery();
     }
 }
예제 #9
0
 private void InternalQueueItemHandler(PersistentQueueItem <T> item)
 {
     try
     {
         bool success = this.queueItemHandler(this, item.Payload);
         if (success)
         {
             this.persistence.Remove(item);
         }
         else
         {
             item.Try++;
             if (item.Try < this.maxTry)
             {
                 item.Priority += this.FailPenaltyTicks;
                 this.persistence.Fail(item);
                 Monitor.Enter(this.queueLock);
                 Monitor.PulseAll(this.queueLock);
                 Monitor.Exit(this.queueLock);
             }
             else
             {
                 this.persistence.Discard(item);
                 LoggerWrapper.Logger.Error(string.Format("{0}: Discard item after {1} try: EnqueueTime: {2}, Data: {3}", new object[]
                 {
                     this.queueName,
                     this.maxTry,
                     item.EnqueueTime,
                     item.PayloadToJson()
                 }));
             }
         }
     }
     catch (Exception ex)
     {
         LoggerWrapper.Logger.Error("PersistentQueueProcessor", ex);
     }
 }
예제 #10
0
 public void Discard(PersistentQueueItem <T> item)
 {
     Guard.ArgumentNotNull <PersistentQueueItem <T> >(item);
     Guard.ArgumentPositive(item.Id);
     this.DiscardImpl(item);
 }
예제 #11
0
 protected abstract void DiscardImpl(PersistentQueueItem <T> item);
예제 #12
0
 protected abstract void FailImpl(PersistentQueueItem <T> item);
예제 #13
0
 public void Remove(PersistentQueueItem <T> item)
 {
     Guard.ArgumentNotNull <PersistentQueueItem <T> >(item);
     Guard.ArgumentPositive(item.Id);
     this.RemoveImpl(item);
 }
예제 #14
0
 protected abstract void RemoveImpl(PersistentQueueItem <T> item);