2015-03-23 14 views
5

xml beslemelerinden veri alabilecek bir web sitesi yapıyorum. MVC AP.NET uygulaması olarak yapıyorum. Örneğin her 2 dakikada bir sunucunun sunucusunda bulunan xml dosyalarından veri almak için uygulamaya ihtiyacım olacak. Bu veriler daha sonra depolanacaktır. Sorun şu ki, bu prosedürün web sitesinin sunucuya yükleneceği andan itibaren kesintisiz olarak gerçekleştirilmesini istiyorum. Verileri her 2 dakikada bir almak için ana yöntemde (?) Bir zamanlayıcı kullanmayı düşünüyordum. Ancak burada başka konuları aradım ve AppFabric'i kullanmanın çözüm olacağını öğrendim. Sorun şu ki, mutlak bir başlangıççıyım ve onu kullanmakta zorlanıyorum ... xml dosyasındaki bu sürekli veri güncellemesini elde etmenin daha basit bir yolu var mı?Zamanlanmış görevleri yapmak için MVC ASP.NET uygulaması ayarlama - Bunu başarmak için Yöntem?

+0

Veriler, ASP.NET web sitesinin kullandığı veritabanında saklanacak mı? Zamanlayıcı bir iş tarafından kovulacak bir Konsol uygulamasında getirme yapamaz mıydınız? O zaman bu konuda endişelenmek için siteye ihtiyacınız olmaz. Ayrıca, AppFabric'in temel olarak önbellekleme için kullanıldığına inanıyorum. – bump

+0

Web sayfalarını sunmadığınızda ve web isteklerine yanıt vermediğinizde neden bir web uygulaması yapmak istiyorsunuz? Bunu planlı bir görev yapmalı veya bir Windows Hizmeti yazmalısınız. IIS, etkin olmadığında web sitenizi kapatır; bu, görevinizin çalışmadığı anlamına gelir. –

+0

Web uygulaması xml feed'lerinden veri alacak, bunları listelerde/tablolarda saklayacak ve gelecekte bir kısmı veritabanlarında saklanacaktır. Güncellenecek listeler/tablolardaki verilere ihtiyacım var ve güncellemeler verilerini görünümlere gönderiyorum. Web sitesi ziyaretçilerinin sadece izlemeleri görecek – user2868674

cevap

2

Yerleşik zamanlayıcıyı kullanmak yerine zamanlamayı işlemek için Quartz kullanmanızı öneririm. Son iki projemde Quartz kullandım ve çok etkilendim. Düşünebileceğiniz herhangi bir program hakkında işleyebilir.

http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html

Örnek İş Yaratma:

using Quartz; 
using Quartz.Impl; 

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
scheduler.Start(); 

IJobDetail integrationJob = JobBuilder.Create<IntegrationJob>().Build(); 

ITrigger integrationTrigger = TriggerBuilder.Create() 
      .StartNow() 
      .WithSimpleSchedule(x => x.WithIntervalInSeconds(300).RepeatForever()).Build(); 

scheduler.ScheduleJob(integrationJob, integrationTrigger); 


public class IntegrationJob : Ijob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     //Write code for job 
    } 
} 
+0

Teşekkür ederiz! Ama ben yeni başlayan biriyim, başka bir sorum var: Zamanlanmış görev xml verilerini çekecek ve listeleri/tabloları güncelleyecektir. Ardından, güncellenmiş model verileri nedeniyle Görünümler güncellenir. Bu, kullanıcıların web sitesini ziyaret edip etmediğine bakılmaksızın işe yarayacak mı? Ve eğer sunucu yeniden başlarsa, tekrar başlayacak, değil mi? – user2868674

+0

Yukarıda gösterildiği gibi iş eklediğinizde .StartNow() uzantı yöntemine sahip olduğunuzdan emin olmak istersiniz. Ardından, kodun zamanlama bölümünü başka bir sınıfa sarmak veya global.asax.cs dosyasına bırakmak ve IIS başlatıldığında, web sunucusunda yapılan herhangi bir istek dikkate alınmaksızın iş çalışır. – Chance

0

Başka, daha basit ve daha yalındır yaklaşım Visual Studio çözümde bir konsol projesi oluşturmak ve Windows Görev Zamanlayıcı onu tekmelemek sahip olmaktır.

    Alan Modelleri ve Depo sınıfları
  • ASP.NET MVC web uygulaması ile
  • A Sınıfı Kütüphane projesi (başvuran: Bunu yapmak için size çözümde en az üç aşağıdaki projeleri olması gerekir Alan Modelleri projeyi başvuran Alan Modelleri projesi)
  • Konsol projesi()
iş mantığı Alan Modelleri enkapsüle edilir böylece Domain Driven Design uyması olur İdeal

, ve web arasında nedenle taşınabilir uygulama ve c onsol uygulaması.

Gerçekten, sadece bir web uygulaması fazlası olabilir herhangi bir proje için bu çözüm kurulumu öneriyoruz:

  • MyApp.Models: A Sınıfı Library alan adı modelleri ve Depo sınıfları için. Domain Driven Design yararlanın ve VS
  • MyApp.Models.Tests projeleri arasında Repository Pattern temel iş mantığı ve ısrarlı depolama taşınabilir erişimi yapmak: Modellerinizin sınıf kütüphanesi için Birim testleri
  • MyApp.Web: Birimi ve fonksiyonel testler: MVC veya WebForms
  • MyApp.Web.Tests proje web projeniz
    • Birim Testleri: En sevdiğiniz Test koşucu kullanın (MS Testi, NUnit, xUnit, vs)
    • Fonksiyonel Testler: Microsoft'tan CodedUI tests veya WatiN programlı web tarayıcısını götürmek için izin verir.Ben de Behavior Driven Development
  • MyApp.Console yapmak isteyenler için SpecFlow öneriyoruz: konsol uygulaması, arka plan işi olarak çalıştırılabilir
  • MyApp.Console.Tests: En konsol uygulaması için birim testleri

biliyorum Bu benim için çok fazla bir şey gibi görünmekle birlikte, benim tecrübelerimdeki projelerim zaman içinde bu yapıya doğru her zaman gözüküyor. Projenizi bu yapıyla akılda tutmak kolaydır ve İş, kaçınılmaz olarak deliliğe dalmak zorunda kaldığı ve uygulamanızın her şeyi yapmasını, ancak kahveyi yapmasını gerektirdiği için çok fazla esneklik sağlar (ne de olsa stajyerler budur!).

0

Hangfire numaralı telefonu kullanmak isteyebilirsiniz. Görevleri planlamanızı sağlar ve görevleri yönetmek için size güzel bir pano sunar. Bunu NuGet'te bulabilirsiniz ve Hangfire sitesinde bulunan belgeler oldukça iyi.

public void Configuration(IAppBuilder app) 
{ 
    app.UseHangfire(config => 
    { 
     config.UseSqlServerStorage("connection string"); 
     config.UseServer(); 
    }); 

    InitializeJobs(); 
} 

public static void InitializeJobs() 
{    
    RecurringJob.AddOrUpdate("jobName",() => CallToJobFunction(), Cron.Minutely); 
} 
İlgili konular