/// <inheritdoc /> public virtual async Task <IReadOnlyCollection <SchedulerStateRecord> > SelectSchedulerStateRecords( ConnectionAndTransactionHolder conn, string?instanceName, CancellationToken cancellationToken = default) { DbCommand cmd; List <SchedulerStateRecord> list = new List <SchedulerStateRecord>(); if (instanceName != null) { cmd = PrepareCommand(conn, ReplaceTablePrefix(SqlSelectSchedulerState)); AddCommandParameter(cmd, "instanceName", instanceName); } else { cmd = PrepareCommand(conn, ReplaceTablePrefix(SqlSelectSchedulerStates)); } AddCommandParameter(cmd, "schedulerName", schedName); using var rs = await cmd.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false); while (await rs.ReadAsync(cancellationToken).ConfigureAwait(false)) { SchedulerStateRecord rec = new SchedulerStateRecord(); rec.SchedulerInstanceId = rs.GetString(ColumnInstanceName) !; rec.CheckinTimestamp = GetDateTimeFromDbValue(rs[ColumnLastCheckinTime]) ?? DateTimeOffset.MinValue; rec.CheckinInterval = GetTimeSpanFromDbValue(rs[ColumnCheckinInterval]) ?? TimeSpan.Zero; list.Add(rec); } return(list); }
/// <summary> /// Create dummy <see cref="SchedulerStateRecord" /> objects for fired triggers /// that have no scheduler state record. Checkin timestamp and interval are /// left as zero on these dummy <see cref="SchedulerStateRecord" /> objects. /// </summary> /// <param name="conn"></param> /// <param name="schedulerStateRecords">List of all current <see cref="SchedulerStateRecord" />s</param> private IList<SchedulerStateRecord> FindOrphanedFailedInstances(ConnectionAndTransactionHolder conn, IList<SchedulerStateRecord> schedulerStateRecords) { IList<SchedulerStateRecord> orphanedInstances = new List<SchedulerStateRecord>(); Collection.ISet<string> allFiredTriggerInstanceNames = Delegate.SelectFiredTriggerInstanceNames(conn); if (allFiredTriggerInstanceNames.Count > 0) { foreach (SchedulerStateRecord rec in schedulerStateRecords) { allFiredTriggerInstanceNames.Remove(rec.SchedulerInstanceId); } foreach (string name in allFiredTriggerInstanceNames) { SchedulerStateRecord orphanedInstance = new SchedulerStateRecord(); orphanedInstance.SchedulerInstanceId = name; orphanedInstances.Add(orphanedInstance); Log.Warn("Found orphaned fired triggers for instance: " + orphanedInstance.SchedulerInstanceId); } } return orphanedInstances; }
protected DateTimeOffset CalcFailedIfAfter(SchedulerStateRecord rec) { TimeSpan passed = SystemTime.UtcNow() - lastCheckin; TimeSpan ts = rec.CheckinInterval > passed ? rec.CheckinInterval : passed; return rec.CheckinTimestamp.Add(ts).Add(TimeSpan.FromMilliseconds(7500)); }
/// <summary> /// A List of all current <see cref="SchedulerStateRecord" />s. /// <p> /// If instanceId is not null, then only the record for the identified /// instance will be returned. /// </p> /// </summary> /// <param name="conn">The DB Connection</param> /// <param name="instanceName">The instance id.</param> /// <returns></returns> public virtual IList SelectSchedulerStateRecords(ConnectionAndTransactionHolder conn, string instanceName) { IDbCommand cmd; ArrayList list = new ArrayList(); if (instanceName != null) { cmd = PrepareCommand(conn, ReplaceTablePrefix(SqlSelectSchedulerState)); AddCommandParameter(cmd, 1, "instanceName", instanceName); } else { cmd = PrepareCommand(conn, ReplaceTablePrefix(SqlSelectSchedulerStates)); } using (IDataReader rs = cmd.ExecuteReader()) { while (rs.Read()) { SchedulerStateRecord rec = new SchedulerStateRecord(); rec.SchedulerInstanceId = GetString(rs[ColumnInstanceName]); rec.CheckinTimestamp = new DateTime(Convert.ToInt64(rs[ColumnLastCheckinTime], CultureInfo.InvariantCulture)); rec.CheckinInterval = TimeSpan.FromMilliseconds(Convert.ToInt64(rs[ColumnCheckinInterval], CultureInfo.InvariantCulture)); list.Add(rec); } } return list; }