private MessageProcessState ProcessMessage(RawMessageDescriptor message, MessageProcessState state) { if (!message.SourceFolder.Equals(state.CurrentFolder)) { if (!String.IsNullOrWhiteSpace(state.CurrentFolder)) { Logger.Debug("Processed folder " + state.CurrentFolder + ", read=" + state.CurrentFolderConsumed + ", queued=" + state.CurrentFolderProcessed); } state.CurrentFolder = message.SourceFolder; state.CurrentFolderProcessed = 0; state.CurrentFolderConsumed = 0; } state.CurrentFolderConsumed++; try { /* This is now initialised in the initialise method * if (_nextReader.Status == MessageProcessorStatus.Idle) * { * _nextReader.Initialise(); * } */ _nextReader.Process(ConvertRawToMsg(message)); state.CurrentFolderProcessed++; SucceededMessageCount++; } catch (Exception ex) { Logger.Error("Failed to process raw [" + message.SourceId + "] into msg : " + ex.Message, ex); FailedMessageCount++; } finally { ProcessedMessageCount++; } return(state); }
private void RunMboxReader() { Status = MessageProcessorStatus.Started; _messageBuffer = new StringBuilder(); char[] buffer = new char[1024 * 1024]; foreach (var folderMap in _folderMap) { StreamReader filestream = null; String mboxPath = folderMap.Key; String folderPath = folderMap.Value; try { filestream = new StreamReader(mboxPath); // drop the first From line. filestream.ReadLine(); int read = filestream.Read(buffer, 0, buffer.Length); while (read > 0) { _messageBuffer.Append(buffer, 0, read); //Logger.Debug(buffer); var eml = GetNextMessage(filestream); while (!String.IsNullOrEmpty(eml)) { try { var messageDescriptor = buildMessage(eml, folderPath); _nextReader.Process(messageDescriptor); SucceededMessageCount++; } catch (Exception ex) { Logger.Error("Failed to get and enqueue Imap message [" + _nextUid + "]", ex); FailedMessageCount++; } ProcessedMessageCount++; eml = GetNextMessage(filestream); } read = filestream.Read(buffer, 0, buffer.Length); if (TestOnly && ProcessedMessageCount > 20) { break; } } } catch (Exception ex) { Logger.Error("Opening mbox file [" + mboxPath + "] failed : " + ex.Message, ex); throw ex; } finally { Logger.Info("Completed folder " + folderPath + ", " + ProcessedMessageCount + " processed, " + SucceededMessageCount + " succeeded, " + IgnoredMessageCount + " ignored, " + FailedMessageCount + " failed."); try { if (filestream != null) { filestream.Close(); } } catch (Exception e) { Logger.Warn("Failed to close file " + mboxPath, e); } } } Close(); }