parallel multiple rss feeds

This commit is contained in:
Tommy Parnell
2017-09-16 12:16:44 -04:00
parent 133c5cf3fb
commit 485dccd228
2 changed files with 26 additions and 7 deletions

View File

@@ -17,6 +17,7 @@ namespace jezebel.Controllers
{ {
IMemoryCache cache; IMemoryCache cache;
const string jezCache = "jezebelRss"; const string jezCache = "jezebelRss";
HashSet<string> urls = new HashSet<string>() { "http://jezebel.com/rss", "http://pictorial.jezebel.com/rss", "http://themuse.jezebel.com/rss", "http://thatswhatshesaid.jezebel.com/rss", "http://theslot.jezebel.com/rss" };
public ValuesController(IMemoryCache cache) public ValuesController(IMemoryCache cache)
{ {
@@ -28,12 +29,20 @@ namespace jezebel.Controllers
{ {
using (var httpClient = new HttpClient()) using (var httpClient = new HttpClient())
{ {
var result = cache.Get<Rss>(jezCache);
var result = cache.Get<List<Item>>(jezCache);
if(result == null || bypassCache) if(result == null || bypassCache)
{ {
var rssRaw = await httpClient.GetStreamAsync("http://jezebel.com/rss"); var lst = new System.Collections.Concurrent.ConcurrentBag<Item>();
Parallel.ForEach(urls, url =>
{
var rssRaw = httpClient.GetStreamAsync(url).Result;
var xmlReader = new XmlSerializer(typeof(Rss)); var xmlReader = new XmlSerializer(typeof(Rss));
result = (Rss)xmlReader.Deserialize(rssRaw); var rssDeserialized = (Rss)xmlReader.Deserialize(rssRaw);
rssDeserialized.Channel.Items.ForEach(a => lst.Add(a));
});
result = lst.Where(a => !a.Category.Any(b => b.Text.Contains("deals"))).Distinct(new Item()).ToList();
using (var entry = cache.CreateEntry(jezCache)) using (var entry = cache.CreateEntry(jezCache))
{ {
entry.SetValue(result); entry.SetValue(result);
@@ -43,8 +52,8 @@ namespace jezebel.Controllers
} }
var rng = new Random(); var rng = new Random();
var randomArticleNumber = rng.Next(0, result.Channel.Items.Count); var randomArticleNumber = rng.Next(0, result.Count);
var randomArticle = result.Channel.Items[randomArticleNumber]; var randomArticle = result[randomArticleNumber];
var resultString = $"{randomArticle.Title} by {randomArticle.Creator} {randomArticle.Link}"; var resultString = $"{randomArticle.Title} by {randomArticle.Creator} {randomArticle.Link}";
return new ContentResult() { Content = resultString, ContentType = "text", StatusCode = 200 }; return new ContentResult() { Content = resultString, ContentType = "text", StatusCode = 200 };

12
Rss.cs
View File

@@ -34,7 +34,7 @@ namespace jezebel
} }
[XmlRoot(ElementName = "item")] [XmlRoot(ElementName = "item")]
public class Item public class Item : IEqualityComparer<Item>
{ {
[XmlElement(ElementName = "title")] [XmlElement(ElementName = "title")]
public string Title { get; set; } public string Title { get; set; }
@@ -50,6 +50,16 @@ namespace jezebel
public Guid Guid { get; set; } public Guid Guid { get; set; }
[XmlElement(ElementName = "creator", Namespace = "http://purl.org/dc/elements/1.1/")] [XmlElement(ElementName = "creator", Namespace = "http://purl.org/dc/elements/1.1/")]
public string Creator { get; set; } public string Creator { get; set; }
public bool Equals(Item x, Item y)
{
return x.Title.Equals(y.Title);
}
public int GetHashCode(Item obj)
{
return obj.Title.GetHashCode();
}
} }
[XmlRoot(ElementName = "channel")] [XmlRoot(ElementName = "channel")]