아시다시피, 애플리케이션 풀 재활용 또는 애플리케이션 비 활동으로 인해 되풀이 작업이 지연되고 지연된 작업이 대기열에 포함되지 않으며 대기열에 추가 된 작업이 처리되지 않습니다. 실행 (위 이상) 7.5을 IIS
전체 설치 방법 - 당신이 '전제'응용 프로그램을 호스팅하는 경우
당신은 윈도우 서버 (또는 이상) 2008 R2와 함께 제공되는 '자동 시작'기능을 사용할 수 있습니다 Hangfire 설명서에 있습니다. - http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html
아래에 요약 해 드리겠습니다.
1)
이 IProcessHostPreloadClient
public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
HangfireBootstrapper.Instance.Start();
}
}
2)
이 global.asax.cs
public class Global : HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
//note - we haven't yet created HangfireBootstrapper
HangfireBootstrapper.Instance.Start();
}
protected void Application_End(object sender, EventArgs e)
{
HangfireBootstrapper.Instance.Stop();
}
}
3)
01 업데이트 구현하는 클래스를 만듭니다위에서 언급 한 HangfireBootstrapper
클래스를 만듭니다.
public class HangfireBootstrapper : IRegisteredObject
{
public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();
private readonly object _lockObject = new object();
private bool _started;
private BackgroundJobServer _backgroundJobServer;
private HangfireBootstrapper()
{
}
public void Start()
{
lock (_lockObject)
{
if (_started) return;
_started = true;
HostingEnvironment.RegisterObject(this);
GlobalConfiguration.Configuration
.UseSqlServerStorage("connection string");
// Specify other options here
_backgroundJobServer = new BackgroundJobServer();
}
}
public void Stop()
{
lock (_lockObject)
{
if (_backgroundJobServer != null)
{
_backgroundJobServer.Dispose();
}
HostingEnvironment.UnregisterObject(this);
}
}
void IRegisteredObject.Stop(bool immediate)
{
Stop();
}
}
4)
서비스가
위의 클래스를 생성 한 후, 전역 applicationHost.config 파일은 파일을 편집해야 자동 시작 사용 (이 % WINDIR % \ System32 \ inetsrv \ 설정 \ applicationHost.config). 먼저 응용 프로그램 풀의 시작 모드를 AlwaysRunning으로 변경 한 다음 서비스 자동 시작 공급자를 사용하도록 설정해야합니다.마지막 항목, WebApplication1.ApplicationPreload이 IProcessHostPreloadClient를 구현하고 WebApplication1을 당신의 응용 프로그램의 라이브러리의 이름입니다 응용 프로그램에서 클래스의 전체 이름입니다
는
<applicationPools>
<add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>
<!-- ... -->
<sites>
<site name="MySite" id="1">
<application path="/" serviceAutoStartEnabled="true"
serviceAutoStartProvider="ApplicationPreload" />
</site>
</sites>
<!-- Just AFTER closing the `sites` element AND AFTER `webLimits` tag -->
<serviceAutoStartProviders>
<add name="ApplicationPreload" type="WebApplication1.ApplicationPreload, WebApplication1" />
</serviceAutoStartProviders>
참고. 자세한 내용은 여기를 참조하십시오.
IdleTimeout을 0으로 설정할 필요가 없습니다. 응용 프로그램 풀의 시작 모드가 AlwaysRunning으로 설정된 경우 유휴 시간 제한이 더 이상 작동하지 않습니다. .
어떻게 사이트를 호스팅하고 있습니까? 그것은 당신의 서버에 있습니까? – Alex
이런 종류의 일을하기 위해 웹 사이트를 사용하면 안됩니다. Azure Webjob 또는 AWS Lambda를 확인할 수 있습니다. 그렇지 않으면 예약 된 작업이나 Windows 서비스를 작성하는 것이 좋습니다. –
@StephenZeng 이것이 정확히 Hangfire의 목적입니다! – Alex