forked from HangfireIO/Hangfire.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
285 lines (271 loc) · 14.9 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
---
layout: default
title: Hangfire – Background jobs and workers for ASP.NET
jumbotron: true
keywords: asp.net background jobs, asp.net background workers
description: Incredibly easy way to perform fire-and-forget, delayed and recurring tasks in ASP.NET applications. No Windows Service required, backed by persistent storage.
---
<div class="jumbotron jumbotron-underlined">
<div class="container">
<div class="row" itemscope itemtype="http://schema.org/SoftwareApplication">
<div class="col-md-7">
<h1 itemprop="name">Hangfire</h1>
<p>
Incredibly easy way to perform fire-and-forget, delayed and recurring tasks inside ASP.NET applications. No Windows Service required.
</p>
<p>
Backed by persistent storages. Open and free for commercial use.
</p>
<p style="font-size: inherit;">
<img style="display: inline-block;vertical-align: inherit;margin-right:5px;" src="http://img.shields.io/nuget/v/Hangfire.svg?style=flat">
<span class="fb-share-button" data-href="http://hangfire.io" data-type="button_count"></span>
<span class="g-plusone" data-size="medium" data-href="http://hangfire.io"></span>
<!-- Поместите этот тег за последним тегом виджета кнопка +1. -->
<script type="text/javascript">
(function() {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/platform.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
</script>
<iframe src="http://ghbtns.com/github-btn.html?user=HangfireIO&repo=Hangfire&type=watch&count=true"
allowtransparency="true" frameborder="0" scrolling="0" width="89" height="20"></iframe>
<a href="https://twitter.com/share" class="twitter-share-button" data-via="hangfire_net" data-url="http://hangfire.io">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
</p>
</div>
<div class="col-md-5">
<div id="screenshots" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="#screenshots" data-slide-to="0" class="active"></li>
<li data-target="#screenshots" data-slide-to="1"></li>
<li data-target="#screenshots" data-slide-to="2"></li>
<li data-target="#screenshots" data-slide-to="3"></li>
<li data-target="#screenshots" data-slide-to="4"></li>
<li data-target="#screenshots" data-slide-to="5"></li>
<li data-target="#screenshots" data-slide-to="6"></li>
</ol>
<!-- Wrapper for slides -->
<div class="carousel-inner">
<div class="item active">
<a href="/img/dashboard.png" data-lightbox="Screenshots" data-title="Dashboard">
<img itemprop="image" src="/img/dashboard-sm.png" alt="Hangfire Dashboard">
</a>
</div>
<div class="item">
<a href="/img/succeeded-job.png" data-lightbox="Screenshots" data-title="Succeeded Job">
<img src="/img/succeeded-job-sm.png" alt="Hangfire Succeeded Job">
</a>
</div>
<div class="item">
<a href="/img/failed-job.png" data-lightbox="Screenshots" data-title="Failed Job">
<img src="/img/failed-job-sm.png" alt="Hangfire Failed Job">
</a>
</div>
<div class="item">
<a href="/img/succeeded-jobs.png" data-lightbox="Screenshots" data-title="Succeeded Job List">
<img src="/img/succeeded-jobs-sm.png" alt="Hangfire Succeeded Job List">
</a>
</div>
<div class="item">
<a href="/img/failed-jobs.png" data-lightbox="Screenshots" data-title="Failed Job List">
<img src="/img/failed-jobs-sm.png" alt="Hangfire Failed Job List">
</a>
</div>
<div class="item">
<a href="/img/recurring-jobs.png" data-lightbox="Screenshots" data-title="Recurring Jobs">
<img src="/img/recurring-jobs-sm.png" alt="Hangfire Recurring Jobs">
</a>
</div>
<div class="item">
<a href="/img/queues.png" data-lightbox="Screenshots" title="Queues">
<img src="/img/queues-sm.png" alt="Hangfire Queue List">
</a>
</div>
</div>
<!-- Controls -->
<a class="left carousel-control" href="#screenshots" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left"></span>
</a>
<a class="right carousel-control" href="#screenshots" data-slide="next">
<span class="glyphicon glyphicon-chevron-right"></span>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-4">
<h3>Fire and forget tasks</h3>
<pre><span class="comm">// Static methods are for demo purposes</span>
<span class="type">BackgroundJob</span>.Enqueue(<span class="hidden-sm">
</span>() => <span class="type">Console</span>.WriteLine(<span class="string">"Simple!"</span>));</pre>
<h3>Delayed tasks</h3>
<pre><span class="type">BackgroundJob</span>.Schedule(<span class="hidden-sm">
</span>() => <span class="type">Console</span>.WriteLine(<span class="string">"Reliable!"</span>), <span class="hidden-sm">
</span><span class="type">TimeSpan</span>.FromDays(7));</pre>
<h3>Recurring tasks</h3>
<pre><span class="type">RecurringJob</span>.AddOrUpdate(<span class="hidden-sm">
</span>() => <span class="type">Console</span>.WriteLine(<span class="string">"Transparent!"</span>), <span class="hidden-sm">
</span><span class="type">Cron</span>.Daily);</pre>
</div>
<div class="col-md-4">
<h3>Run them inside a web app…</h3>
<p><em>Forget about AppDomain unloads, Web Garden & Web Farm issues – Hangfire is reliable for ASP.NET from scratch, even on Shared Hosting!</em></p>
<pre><span class="keywd">public</span> <span class="keywd">void</span> Configuration(<span class="type">IAppBuilder</span> app)
{
app.UseHangfire(cfg => cfg.UseServer());
}</pre>
<h3>… or anywhere else</h3>
<p><em>In console application, Windows Service, Azure Worker Role, etc.</em></p>
<pre><span class="keywd">var</span> server = <span class="keywd">new</span> <span class="type">BackgroundJobServer</span>();
server.Start();</pre>
</div>
<div class="col-md-4 hidden-xs hidden-sm">
<a height="354" class="twitter-timeline" href="https://twitter.com/hangfireio" data-widget-id="451027617567621120">Твиты пользователя @hangfireio</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
</div>
</div>
<br>
<div class="row">
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-send"></span>
</div>
<div class="feature-body">
<h3>Simple</h3>
<p>
<a href="http://docs.hangfire.io/en/latest/quickstart.html" target="_blank">Easy to setup, easy to configure</a>. You don't need to run additional services or console programs for background job processing.
</p>
<p>
You can call regular static or instance .NET methods in background and pass arguments as usual.
</p>
</div>
</div>
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-tower"></span>
</div>
<div class="feature-body">
<h3>Reliable</h3>
<p>
Background jobs are being deleted from the storage only on successful execution. Abruptly aborted jobs will be requeued after application restart.
</p>
<p>
Once a job was created, it will be performed <em>at least once</em>, even if the host process was terminated.
</p>
</div>
</div>
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-ok"></span>
</div>
<div class="feature-body">
<h3>Designed for ASP.NET</h3>
<p>
Background tasks are being saved into a persistent storage and can survive the application pool recycling process.
</p>
<p>
You can run <a href="http://docs.hangfire.io/en/latest/users-guide/running-multiple-server-instances.html" target="_blank">multiple instances</a> of Hangfire Server, so Web Garden & Web Farm environments are fully supported.
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-search"></span>
</div>
<div class="feature-body">
<h3>Transparent</h3>
<p>
Watch the <a href="http://hangfire.io/img/dashboard.png" target="_blank">statistics</a>, know the <a href="http://hangfire.io/img/failed-job.png" target="_blank">detailed history</a> of job processing, manually <a href="http://hangfire.io/img/failed-jobs.png" target="_blank">retry or delete</a> any job from the integrated web monitoring UI.
</p>
<p>
<a href="http://docs.hangfire.io/en/latest/users-guide/adding-logging.html" target="_blank">Plug in</a> your logging framework to get notifications about problems in background job processing.
</p>
</div>
</div>
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-fullscreen"></span>
</div>
<div class="feature-body">
<h3>Scalable</h3>
<p>
Start with the simplest setup using SQL Server and grow your computational power by adding extra Hangfire Server instances either inside ASP.NET apps or use separate Windows Services.
</p>
<p>
Leverage multiple job storages to overcome the restrictions dictated by a single storage.
</p>
</div>
</div>
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-th-large"></span>
</div>
<div class="feature-body">
<h3>Extensible</h3>
<p>
Intercept the creation/performance/state change pipeline to add extra functionality using filters that are similar to ASP.NET MVC Filters.
</p>
<p>
Implement the support of persistent storage which is being used in your project environment – it is also abstracted.
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-flash"></span>
</div>
<div class="feature-body">
<h3>Efficient</h3>
<p>
Although the default installation uses SQL Server and polling technique to fetch jobs, you can leverage <a href="https://www.nuget.org/packages/Hangfire.SqlServer.MSMQ/">MSMQ</a> or <a href="https://www.nuget.org/packages/Hangfire.Redis/" target="_blank">Redis</a> extensions to reduce the processing latency to minimum.
</p>
</div>
</div>
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-cog"></span>
</div>
<div class="feature-body">
<h3>Self-maintainable</h3>
<p>
You don't need to manually clear the storage – Hangfire keeps it as clean as possible and removes old records automatically.
</p>
</div>
</div>
<div class="col-md-4 feature">
<div class="feature-icon">
<span class="glyphicon glyphicon-user"></span>
</div>
<div class="feature-body">
<h3>Open source</h3>
<p>
Hangfire is open source software and is completely free for commercial use. It is licensed under <a href="https://github.com/HangfireIO/Hangfire/blob/master/LICENSE.md">LGPLv3 license</a>.
</p>
<p>
Fork <a href="https://github.com/HangfireIO/Hangfire" target="_blank">the project</a> and make contributions on GitHub!
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12" style="text-align: center;">
<hr>
<div>
<a class="btn btn-primary btn-lg" href="/overview.html">Overview</a>
<br class="visible-xs">
<span class="btn btn-lg">or</span>
<br class="visible-xs">
<a class="btn btn-default btn-lg" href="http://docs.hangfire.io">Documentation</a>
</div>
</div>
</div>
</div>