Любые существующие проекты / программное обеспечение для отправки почасовых сообщений о статусе - PullRequest
0 голосов
/ 13 января 2012

Классическое требование проверки состояния системы и уведомления пользователей. В частности, я буду посещать базу данных каждый раз, получая некоторые данные, а затем рассылаю уведомления по электронной почте на основе результатов. Черт, эта служба может даже не отправлять электронную почту, а создавать запись уведомления в базе данных.

Похоже, что с IOC и конфигурацией может существовать универсальная служба Windows, которая управляет всем этим, наряду с метриками и управлением, простым способом.

В прошлом я делал уведомления по электронной почте: 1) Запуск сценариев как заданий cron (в Windows) 2) запуск пользовательских исполняемых файлов как cron / at jobs 3) используя что-то вроде DatabaseMail SQLServer. 4) Пользовательские NT-сервисы, которые постоянно отслеживают события.

Есть ли проекты с открытым исходным кодом, которые управляют этим? Это тот тип кода, который я написал много раз на разных платформах, но не хочу тратить несколько дней, делая это сейчас.

Единственное, что я нашел до сих пор, это Quartz.Net

Спасибо

1 Ответ

0 голосов
/ 13 января 2012

Я просто создаю службу Windows и использую Reactive Extensions для планирования задач. Если вам не нужна такая большая гибкость, как предлагает cron, это прекрасно работает. Вот абстрактный почасовой бегун. (использует log4net)

public abstract class HourlyTask : IWantToRunAtStartup
{
    protected readonly ILog Log = LogManager.GetLogger(typeof (HourlyTask).FullName);
    private IDisposable _Subscription;

    private void ExecuteWithLog()
    {
        Log.Debug("Triggering " + GetType());
        try
        {
            Execute();
        }
        catch (Exception exception)
        {
            Log.Error("Hourly execution failed", exception);
        }
    }

    public abstract void Execute();

    public void Run()
    {
        _Subscription = Observable
            .Interval(TimeSpan.FromMinutes(1))
            .Select(x => DateTime.Now.Hour)
            .DistinctUntilChanged()
            .Subscribe(i => ExecuteWithLog());
    }

    public void Stop()
    {
        if (_Subscription == null)
        {
            return;
        }
        _Subscription.Dispose();
    }
}

Тогда в вашем методе запуска вы можете просто разрешить все IWantToRunAtStartup экземпляры и вызвать Run() для них.

...