comparison Stocks/Stocks.Service/StocksService.cs @ 0:e5d46bb6cdb0

Initial commit
author adminSH stevenhollidge@hotmail.com
date Mon, 20 Feb 2012 13:52:35 +0700
parents
children 29ed98d659e9
comparison
equal deleted inserted replaced
-1:000000000000 0:e5d46bb6cdb0
1 using System;
2 using System.Collections.Concurrent;
3 using System.Collections.Generic;
4 using System.Diagnostics;
5 using System.Linq;
6 using System.Net;
7 using System.Threading.Tasks;
8 using NLog;
9 using Stocks.Common;
10 using Stocks.Common.Models;
11 using Stocks.Common.Events;
12
13 namespace Stocks.Service
14 {
15 public class StocksService : IStocksService
16 {
17 private static readonly Logger Log = LogManager.GetCurrentClassLogger();
18
19 private IList<Company> _companies;
20 private IConfigurationService _configurationService;
21 private List<Price> _currentPrices;
22 private string _serviceUrl;
23 private WebClient _webClient;
24
25 public bool IsActive { get; private set; }
26 public SummaryStats Stats { get; private set; }
27
28 public StocksService(IConfigurationService configurationService)
29 {
30 new AssemblyInit();
31
32 _webClient = new WebClient();
33 _configurationService = configurationService;
34 _companies = configurationService.GetCompanies();
35
36 string symbolsCsv = _companies.Select(
37 c => c.Symbol).Aggregate((c, d) => c + "," + d);
38 _serviceUrl = _configurationService.GetServiceUrl(symbolsCsv);
39
40 Stats = new SummaryStats();
41 }
42
43 public delegate void PriceChangedEventHandler(object sender, PriceChangedEventArgs e);
44 public event PriceChangedEventHandler PriceChanged;
45 protected virtual void RaisePriceChanged(Price price)
46 {
47 Stats.PriceChangeEvents++;
48
49 if (PriceChanged != null)
50 PriceChanged(this, new PriceChangedEventArgs() { Price = price });
51 }
52
53 public void Start()
54 {
55 PrepareForServiceStarting();
56 Task.Factory.StartNew(() => DownloadPrices());
57 }
58
59 public void Stop()
60 {
61 IsActive = false;
62 Log.Debug("StockService stopped");
63 }
64
65 private void PrepareForServiceStarting()
66 {
67 Log.Debug("StockService starting");
68 IsActive = true;
69 Stats.Reset();
70 _currentPrices = new List<Price>(_companies.Count);
71 }
72
73 private void DownloadPrices()
74 {
75 try
76 {
77 Stopwatch timeToDownload = new Stopwatch();
78
79 while (IsActive)
80 {
81 timeToDownload.Restart();
82 string webResponse = _webClient.DownloadString(_serviceUrl);
83 timeToDownload.Stop();
84
85 PopulatePricesFromWebResponse(webResponse);
86 UpdateStats(timeToDownload, webResponse);
87 }
88 }
89 catch (Exception e)
90 {
91 Log.Error("Exception during DownloadPrices()");
92 Log.Error("Stack Trace {0}: /r/nException Message: {1}", e.StackTrace, e.Message);
93 this.Stop();
94 }
95 }
96
97 private void PopulatePricesFromWebResponse(string webResponse)
98 {
99 string[] webPrices = webResponse.Split(
100 new string[] { "\n", "\r\n" },
101 StringSplitOptions.RemoveEmptyEntries);
102
103 foreach (string webPriceData in webPrices)
104 {
105 var webPrice = Factory.CreatePrice(webPriceData);
106 var localPrice = _currentPrices.Find(x => x.Symbol == webPrice.Symbol);
107
108 if (localPrice == null) {
109 _currentPrices.Add(new Price(webPrice.Symbol, webPrice.CurrentPrice, webPrice.PreviousPrice));
110 continue;
111 }
112
113 if (localPrice.Equals(webPrice)) {
114 continue;
115 }
116 else {
117 localPrice.PreviousPrice = localPrice.CurrentPrice;
118 localPrice.CurrentPrice = webPrice.CurrentPrice;
119 RaisePriceChanged(localPrice);
120 }
121 }
122 }
123
124 private void UpdateStats(Stopwatch timeToDownload, string webResponse)
125 {
126 Stats.LastWebRequest.Duration = (int)timeToDownload.ElapsedMilliseconds;
127 Stats.LastWebRequest.PricesDownloaded = _currentPrices.Count;
128 Stats.LastWebRequest.Response = webResponse;
129 Stats.LastWebRequest.Request = _serviceUrl;
130 Stats.LastWebRequest.SymbolCount = _companies.Count;
131 Stats.NumberOfRequests++;
132 Log.Trace(Stats);
133 }
134 }
135 }