Как запустить 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.

Пример

Другие вопросы по тегам