private void StartProcessingQueue(TwitterContext userStreamContext, TwitterContext trackerStreamContext)
{
var screenname = PrimaryUser.TwitterScreenName;
var queueTime = int.Parse(ConfigurationManager.AppSettings["QueueTime"] ?? "60000");
queueTimer = new Timer(queueTime);
queueTimer.Elapsed += new ElapsedEventHandler((x, y) =>
{
queueTimer.Enabled = false;
bool restartTracker = false;
try
{
log.WriteLine("{0}: Processing Queue", DateTime.Now);
lock (queue_lock)
{
if (queue.Count == 0)
{
log.WriteLine("{0}: No Items to Process", DateTime.Now);
return;
}
tweets = new Tweet[queue.Count];
queue.CopyTo(tweets);
queue.Clear();
}
tweets = tweets.Distinct().ToArray();
log.WriteLine("{0}: Processing {1} Items from Queue", DateTime.Now, tweets.Length);
//Currently there is only one step but there could potentially be multiple user defined steps
GetIProcessingStep().ProcessItems(tweets).Wait();
if (processingStep is IKeywordSuggestionStep)
{
try { restartTracker = (processingStep as IKeywordSuggestionStep).HasNewKeywordSuggestions(); }
catch { }
}
tweets = null;
}
catch (Exception ex)
{
log.WriteLine("{0}: Error: {1}", DateTime.Now, ex.ToString());
}
finally
{
try
{
if (userStream != null && Math.Abs((lastCallBackTimeUserStream - DateTime.Now).TotalSeconds) > 90) //The User Stream Stalled or was Closed
{
if (hadUserStreamFailure)
log.WriteLine("{0}: LinqToTwitter User Stream Was Closed Attempting to Reconnect", DateTime.Now);
else
log.WriteLine("{0}: LinqToTwitter User Stream Stalled Attempting to Restart It", DateTime.Now);
userStreamContext = TwitterModel.Instance(PrimaryUser.TwitterScreenName).GetAuthorizedTwitterContext(screenname);
StartTwitterUserStream(userStreamContext);
}
}
catch (Exception ex)
{
log.WriteLine("{0}: Error: {1}", DateTime.Now, ex.ToString());
}
try
{
if (restartTracker || //The tracker should be restarted because we have new potential keywords to track
(trackerStream != null && Math.Abs((lastCallBackTimeTrackerStream - DateTime.Now).TotalSeconds) > 90)) //The Tracker Stream Stalled or was Closed
{
if (hadTrackerStreamFailure)
log.WriteLine("{0}: LinqToTwitter Tracker Stream was Closed Attempting to Reconnect", DateTime.Now);
else if (restartTracker)
log.WriteLine("{0}: LinqToTwitter Tracker Stream will be Restarted to Track more Keywords", DateTime.Now);
else
log.WriteLine("{0}: LinqToTwitter Tracker Stream Stalled Attempting to Restart It", DateTime.Now);
if (trackerStream != null)
trackerStream.CloseStream();
trackerStreamContext = TwitterModel.Instance(PrimaryUser.TwitterScreenName).GetAuthorizedTwitterContext(screenname);
StartTwitterTrackerStream(trackerStreamContext);
}
}
catch (Exception ex)
{
log.WriteLine("{0}: Error: {1}", DateTime.Now, ex.ToString());
}
queueTimer.Enabled = true;
log.WriteLine("{0}: Completed Processing Queue", DateTime.Now);
}
});
log.WriteLine("{0}: Processing Queue every {1} milliseconds", DateTime.Now, queueTime);
queueTimer.Start();
}