2016-08-17 2 views
1

현재 매분 전자 메일을 확인하고 발송하는 작업이 있습니다. 작업 스케줄러로 hangfire를 사용하고 있지만 올바르게 작동하려면 사이트를 활성 상태로 유지해야합니다. Windows 서비스를 사용 살아 따로 사이트를 유지하기 위해ASP MVC 5 사이트 활성 유지

public static bool Ping() 
{ 
     try 
     { 
      var request = (HttpWebRequest)WebRequest.Create('http://xyz.domain.com'); 
      request.Timeout = 3000; 
      request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector 
      request.Method = "HEAD"; 

      using (request.GetResponse()) 
      { 
       return true; 
      } 
     } 
     catch 
     { 
      return false; 
     } 
} 

누구나 더 나은 또는 더 효율적인 방법을 알고 : 나는 살아 사이트를 유지하기 위해 다음과 같이 5 분마다 실행하는 다른 작업을 사용하고이 라운드하려면 또는 작업 스케줄러?

+0

어떻게 사이트를 호스팅하고 있습니까? 그것은 당신의 서버에 있습니까? – Alex

+0

이런 종류의 일을하기 위해 웹 사이트를 사용하면 안됩니다. Azure Webjob 또는 AWS Lambda를 확인할 수 있습니다. 그렇지 않으면 예약 된 작업이나 Windows 서비스를 작성하는 것이 좋습니다. –

+0

@StephenZeng 이것이 정확히 Hangfire의 목적입니다! – Alex

답변

1

지난 주에 동일한 목적으로 Azure Scheduler을 사용했습니다. 나는 그것이 아주 좋은 도구라고 생각을 할 수 있습니다

  • 일정 작업,
  • 작업 defince
  • 그래서

등 예약 된 작업

  • 의 역사
  • GET 접근 MSDN 가입이 있다면 고려해야 할 가치가 있다고 생각합니다.

  • 0

    아시다시피, 애플리케이션 풀 재활용 또는 애플리케이션 비 활동으로 인해 되풀이 작업이 지연되고 지연된 작업이 대기열에 포함되지 않으며 대기열에 추가 된 작업이 처리되지 않습니다. 실행 (위 이상) 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으로 설정된 경우 유휴 시간 제한이 더 이상 작동하지 않습니다. .

    +0

    사이트가 내부적으로 호스팅되고 있지만 서버 팀이 위에 동의하지 않을 수 있습니다. 그래서 내가 원래 게시물에 따라 해킹을해야만하는 이유입니다. – adam78

    +0

    이것은 공식적인 hangfire 문서에 의해 문서화 된 것처럼 '모범 사례'방법입니다 ... – Alex

    +0

    다른 방법은 pingdom 또는 가동 시간 로봇 또는 무언가와 같은 서비스를 사용하여 매 x 분마다 사이트에 '핑 (ping)'하여 살아 있도록 유지하는 것입니다 – Alex