30行のカスタムスケジュールを備えた完全なWindowsサービス

みなさんこんにちは。

最近、データ収集に関する一連の記事全体を読むことにしました。 そして、 最初の部分から始めて、Windowsサービスについて多くの興味深いことがわかりました。
ハングしたタスクは、会社のWebサイトを予定通りにプルする簡単なサービスを書くことでした。 これは新鮮な知識を統合するチャンスだと思います。 正直なところ、私はWindowsサービスに関する記事で書かれていたすべてのチップをねじ込み始めましたが、ジャムに遭遇し始めました。 しかし、それはジャムについてではありません。
別の考えは、誰かが確かにそのようなスマートサービスを既に行っていたこと、そして確かに既製の美しいソリューションがあることだと思いました。 数分間の検索と、私がNCronプロジェクトを見つけたときの驚きは、サービスを作成する簡単な方法だけでなく、
  1. 彼は、Windowsサービスとして自分自身をインストールおよびアンインストールする方法を知っています。
  2. 柔軟なスケジュールに従ってタスクを実行できます(単純な毎日の午前6時から、より複雑な四半期の3日ごとの午後18時40分まで)
  3. 実行するタスクの数に制限はありません。
  4. 一般的なフレームワークのログを簡単に固定でき、イベントログには独自のシンプルなログメカニズムが既に組み込まれています。
  5. お気に入りのIoCコンテナを使用するのに十分な柔軟性を備えています

そして、何か便利で便利なもの。 ですから、それが私が必要としていたものであることに気付くことは難しくありません。 私の側ではほとんど動きのないすべてを行います。 さらに、このプロジェクトがその頭でカバーするような単純なタスクのためにサービスが非常に頻繁に書かれていると言います。


それで、この奇跡をどのように留めるか。

プロジェクトを作成する



最初に、 コンソールアプリケーションプロジェクトを作成します 。 ここではすべてが標準的でシンプルです。

写真1

NCronへの参照を追加



写真3

mainメソッドをわずかに変更します



using NCron.Service;
using NCron.Fluent.Crontab;
using NCron.Fluent.Generics;

namespace ScheduledService
{
class Program
{
static void Main( string [] args)
{
Bootstrap.Init(args, ServiceSetup);
}

static void ServiceSetup(SchedulingService service)
{
}
}
}


これは、コマンドライン引数が渡される理由の問題を提起する可能性があり、後でサービスがそれ自体をインストールできるようにするために必要です( installパラメーターで実行する必要があります)。 スケジュールに従ってタスクを構成するには、後でServiceSetupメソッドが必要になります。

簡単なタスクを作成する



これは単純に行われます。 CronJobクラスからクラスを継承し、抽象Executeメソッドをオーバーライドします。 タスクのコンストラクターに入るリンクを使用して、リクエストの簡単な実装をすぐに追加しました。

using NCron;

namespace ScheduledService
{
public class RequestParameters
{
public String Uri { get ; set ; }
public int Timeout { get ; set ; }
}

public class RequestSenderJob : CronJob
{
private RequestParameters RequestParameters { get ; set ; }
public RequestSenderJob(RequestParameters requestParameters)
{
RequestParameters = requestParameters;
}

public override void Execute()
{
WebRequest request = WebRequest.Create(RequestParameters. Uri );
request.UseDefaultCredentials = true ;
request.Timeout = RequestParameters.Timeout > 0 ? RequestParameters.Timeout * 1000 : 60*1000; //default 1 min <br/>
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Close();
}
}
}


エラーが発生した場合、その説明は既にイベントログに記録されるため、必要に応じて、お気に入りのライブラリを接続してログに記録できることを言わなければなりません。
これでタスクが作成され、起動を設定するだけで済みます。

タスク起動セットアップ



これは、以前に作成されたServiceSetupメソッドServiceSetup場所です。ここに、呼び出しをキューに入れるためのロジックを入力します

using NCron.Fluent.Crontab;
using NCron.Service;

namespace ScheduledService
{
class Program
{
static void Main( string [] args)
{
Bootstrap.Init(args, ServiceSetup);
}

static void ServiceSetup(SchedulingService service)
{
XDocument document = XDocument .Load( "Config.xml" );
var requestTasks = from task in document.Root.Elements( "RequestTask" ) select task;

foreach ( XElement requestTask in requestTasks)
{
RequestParameters requestParameters = new RequestParameters
{
Uri = requestTask. Attribute ( "RequestUri" ).Value,
Timeout = int .Parse(requestTask. Attribute ( "Timeout" ).Value)
};
String shedule = requestTask. Attribute ( "Shedule" ).Value;
service.At(shedule).Run(() => new RequestSenderJob(requestParameters));
}
}

}
}



XMLビューファイルの場合

<?xml version= "1.0" encoding= "utf-8" ?>
<Config>
<RequestTask RequestUri= "http://habrahabr.ru/" Shedule= "0 1 * * *" Timeout= "180" />
</Config>


はい、ここで、1つの変数のnullチェックしなかったという事実について、私を蹴ることができnull (例の明快さと単純さのためだけに行いました)。 しかし、 shedule変数に興味があるはずです。 タスクを起動するスケジュールを説明する文字列を保存します。

スケジュール設定



タスクを起動するスケジュールは、 MINUTES HOURS DAYS MONTHS DAYS-OF-WEEK形式の文字列を使用して設定されます。
以下は、サイト自体からのいくつかの例です。
// 9 . <br/>
service.At( "0 9 * * 0" ).Run<EatBaconAndEggs>();

// 8 , . <br/>
service.At( "0 8 1 1,4,7,10 *" ).Run<SubmitVatDeclaration>();

// , 8 17, . <br/>
service.At( "*/30 8-17 * * 1-5" ).Run<LookAtStackoverflow>();



例からわかるように、数字の代わりに設定することができます: '*'-すべてを選択、 'nm'-mからnまでの範囲、 '* / n'-n番目の値ごとサンプルの種類、そして実際にプログラムでスケジュールの独自のルールを設定できます。

設置



最後に、サービスを開始する方法です。ちなみに、サービスに関連する単一のクラスはありません。 このために、2つの基本バッチファイルを作成しました。

install.bat
ScheduledService install
pause



uninstall.bat
ScheduledService uninstall
pause



真実とパラメーターを備えたより高度なバージョンがあるため、必要な設定でサービスがすぐに作成されます。 あなたはここでそれについて読むことができます

それは基本的にそれです。

Source: https://habr.com/ru/post/J96691/


All Articles