Как запустить Hangfire как отдельный процесс от основного веб-приложения?
У меня сильно упала производительность, когда Hangfire работает в том же пуле приложений, что и мое веб-приложение, и наш сайт стал ужасно медленным, а процессор постоянно загружен на 96%. Я просмотрел документацию Hangfire, и есть способ запустить Hangfire отдельно в виде консоли или службы Windows. Однако я не понимаю, как этого добиться и при этом получить дашборд. Я создал сервис, как описано по этой ссылке Здесь. Ниже приведена текущая установка
Запускать
[assembly: OwinStartup(typeof(MyProject.FrontEnd.Startup))]
namespace MyProject.FrontEnd
{
/// <summary>
///
/// </summary>
public class Startup
{
/// <summary>
///
/// </summary>
/// <param name="app"></param>
public void Configuration(IAppBuilder app)
{
app.UseHangfireAspNet(GetHangfireServers);
app.UseHangfireDashboard();
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.Use<RememberMeTokenMiddleware>();
.........
}
private IEnumerable<IDisposable> GetHangfireServers()
{
GlobalConfiguration.Configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage("eCertDb");
yield return new BackgroundJobServer();
}
Если я только прокомментируюapp.UseHangfireAspNet(GetHangfireServers);
приборная панель и приложения ломаются. я получаю ошибку
Значение свойства JobStorage.Current не было инициализировано. Вы должны установить его перед использованием Hangfire Client или Server API.
. если я прокомментируюapp.UseHangfireDashboard();
, теперь везде, где у меня есть реализация Hangfire, она ломается, например, на моем бизнес-уровне
BackgroundJob.Enqueue<DocumentServiceWorker>(_ => _.PublishDocument(application.ApplicationReferenceNo, false));
Проблема в том, как мне все еще иметь вышеуказанные вызовы в основном приложении, если зависание выполняется в другом процессе? Как мне получить панель мониторинга, если я использую Hangfire как службу Windows, нужен ли мне отдельный сайт?
1 ответ
Я нашел проект, который по существу отвечает на мой вопрос. Вот как я изменил свой код, чтобы просто установить UseSqlServerStorage для клиента.
public class Startup
{
/// <summary>
///
/// </summary>
/// <param name="app"></param>
public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("xxxx");
app.UseHangfireDashboard();
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
.......
}
Для службы Windows я использовал предоставленный пример из блога Hangfire.