on Aug 26th, 2011Hämta information från ett körande objekt
Detta är en uppföljning på ett tidigare inlägg som ni kan finna här:
http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/
Där pratade jag om hur man kan använda sig av Microsofts ramverk “Management.SEO.Crawler” utan att få användaren att fastna i laddning undertiden “ListCrawler”:en arbetade med att söka igenom respektive adress. Detta löstes genom att öppna upp en tråd (Thread) som arbetar parallellt som webbapplikationen. Men för att kunna presentera hur det går för den så måste information hämtas undertiden den körs. Jag kommer nu presentera min lösning på detta problem.
Göra trådarna tillgängliga
När väl användaren har sagt åt “ListCrawler”:en att arbeta med att analysera adresserna i en parallell tråd, och sedan skickats vidare till nästa vy, så kan det vara problem att veta vilket “Thread”-objekt som är det intressanta. Om ni läst förra inlägget och analyserat koden så har du säkert lagt märke till att det objekt identifierar sig med en av sina egenskaper som utgör sig att vara av typen “Guid”. Den ‘id’-nyckeln skickar vi med användaren till den vyn som jag tidigare nämnde. För när användaren väl är där så kommer vi hämta den intressanta informationen med hjälp av Ajax. “Straightforward” kan tyckas, vilket det också är, men där finns en sista sak att nämna innan vi hoppar in i koden.
Nu när användaren har sitt guid och anropar efter information med hjälp av Ajax så måste objektet också finnas tillgängligt. Jag löste detta genom att skapa ett statiskt bibliotek som tar hand om alla användarnas sådana “ListCrawler” objekt, indexerade med deras Guid objekt. Detta bibliotek befinner sig i ett statiskt objekt som hanterar förfrågningar mot biblioteket. There we have it!
{
private static readonly Dictionary<Guid, ListCrawler> Jobs = new Dictionary<Guid, ListCrawler>(); // Biblioteket med alla Crawler objekt
// Metod som hämtar ett ListCrawlerobjekt med en Duid
private static ListCrawler GetWorkingListCrawler(Guid id)
{
return Jobs.ContainsKey(id) ? Jobs[id] : null;
}
public static bool HasWorkingCrawler(Guid id)
{
var wlc = GetWorkingListCrawler(id);
return wlc != null && wlc.HasWorkingCrawler;
}
public static ProgressInformationDTO GetProgressInformation(Guid id)
{
return GetWorkingListCrawler(id).ProgressInformation;
}
public static string GetBaseDirectoryPath(Guid id)
{
return GetWorkingListCrawler(id).FullDirectoryPath;
}
public static void Start(Guid id)
{
if (HasWorkingCrawler(id))
{
var lc = GetWorkingListCrawler(id);
lc.Start();
}
}
public static void Stop(Guid id)
{
if (HasWorkingCrawler(id))
{
var lc = GetWorkingListCrawler(id);
lc.Stop();
}
}
public static void AddListCrawler(ListCrawler lc)
{
Jobs.Add(lc.Id, lc);
}
}
JavaScript
Till detta så är det också en del javascript som arbete i användarens webbläsare. Koden består av ett intervall som kör fuktionen “DoIt” varje sekund. “DoIt” gör ett Ajax-anrop till kontrollern som i sin tur hämtar informationen från rätt “ListCrawler”-objekt och skickar tillbaka den till användarens webbläsare som i sin tur trycker ut den informationen till rätt element.
function () {
setInterval(DoIt, 1000);
$("#continue").hide();
$("#abortTakeMeBack").hide();
$("#abortBtn").click(function () {
$.getJSON("/Home/Abort", { "jobId": "@ViewBag.jobId" }, function (data, textStatus, jqXHR) {
if (data.status) {
$("#abortTakeMeBack").show();
window.clearInterval();
}
});
});
function DoIt() {
$.getJSON("/Home/Status", { "jobId": "@ViewBag.jobId"}, function (data, textStatus, jqXHR) {
if (data.complete) {
window.clearInterval();
$("#infoText").html("Your analize is now complete!");
$("#continue").show();
} else {
$("#infoText").html("Your analize is in progress! This could take several minutes. " + textStatus);
}
if (data.error != null) {
$("#progressError").html(data.error);
}
$("#CurrentUri").html(data.CurrentUri);
$("#BytesDownloaded").html(data.BytesDownloaded);
$("#UrlCounter").html(data.UrlCounter);
$("#TotalUrls").html(data.TotalUrls);
if (data.Percent != undefined) {
$("#progressText").html(data.Percent + "%");
$("#progressBar").width(data.Percent + "%");
}
});
}
});