Redis HangFire
▌Introduction
▌Environment
▋Visual Studio 2017 community
▋ASP.NET MVC 5
▋Hangfire 1.6.19
▋Hangfire.SqlServer 1.6.19
▋StackExchange.Redis 1.2.6
▋Newtonsoft.Json 11.0.2
▌Implement
▋Install packages
▋Create database for Hangfire
First we have to create a
database or use an exist one for Hangfire.
Make sure the connection string
is in your WebConfig.
<connectionStrings>
<add name="HangFire" connectionString="…." providerName="System.Data.SqlClient" />
</connectionStrings>
▋Setup HangFire
Add an OWIN Startup class into
your ASP.NET MVC template.
public void Configuration(IAppBuilder app)
{
this.setHangFire(app);
}
private void setHangFire(IAppBuilder app)
{
var options = new SqlServerStorageOptions
{
QueuePollInterval = TimeSpan.FromSeconds(60), // Default value
};
// Hangfire: Use Sql server
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFire", options);
// Enable HanfireServer
app.UseHangfireServer();
// Enable Hangfire's dashboard
app.UseHangfireDashboard();
}
}
1.
Job storage in Sql server uses
pooling to fetch jobs.The default polling interval is 15 seconds. You can
modify it by defining a custom option: SqlServerStorageOptions
2.
Notice that “HangFie” of this
line is the connection string’s name in WebConfig
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFire", options);
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFire", options);
3.
(Optional) Enable the dashboard
of Hangfire
app.UseHangfireDashboard();
app.UseHangfireDashboard();
▋Build and run to initialize
After initializing Hangfire,
you can open the website like http://MyServer/hangfire
to watch the dashboard.
And check that the tables created automatically by Hangfire.
▋Logging
We don’t have to do extra
settings to enable logging.
However, you can still specify
the logging level of Hangfire in your logging framework.
For example, in NLog.config
<rules>
<logger name="Hangfire.*" levels="Error,
Fatal" writeTo="MyFile" />
</rules>
▋Create Redis Service class
Before scheduling a
Hangfire job, lets create service class for accessing Redis.
public class CacheService
{
private const string SERVER = "MyServer:6379";
private readonly ConnectionMultiplexer redis = null;
private readonly IDatabase redisDb = null;
/// <summary>
/// Constructor
/// </summary>
public CacheService()
{
this.redis = ConnectionMultiplexer.Connect(SERVER);
this.redisDb = redis.GetDatabase();
}
public void SaveCache<T>(string key, T data)
{
var value = JsonConvert.SerializeObject(data);
this.redisDb.StringSet(key, value);
}
public bool GetCache<T>(string key, out T rtn) where T : new()
{
if (redisDb.KeyExists(key))
{
var value = this.redisDb.StringGet(key);
rtn = JsonConvert.DeserializeObject<T>(value);
return true;
}
else
{
rtn = new T();
return false;
}
}
}
▋Fire or Schedule a Background job
//Fire a
background job immediately
BackgroundJob.Enqueue(() => ()=>new CacheService().SaveCache("Emp", data));
//Schedule a
cron job
RecurringJob.RemoveIfExists("CacheEmployeeId");
RecurringJob.AddOrUpdate("CacheEmployeeId", ()=>new CacheService().SaveCache("Emp", data), Cron.Daily);
Result
for firing a background job immediately
Result
for scheduling a cron job
▌Reference
沒有留言:
張貼留言