public IList<PersistentMessage> GetMessagesToSendAndMarkThemAsInFlight(int maxNumberOfMessage, int maxSizeOfMessagesInTotal, out Endpoint endPoint) { Api.MoveBeforeFirst(session, outgoing); endPoint = null; string queue = null; var messages = new List<PersistentMessage>(); while (Api.TryMoveNext(session, outgoing)) { var msgId = new Guid(Api.RetrieveColumn(session, outgoing, ColumnsInformation.OutgoingColumns["msg_id"])); var value = (OutgoingMessageStatus)Api.RetrieveColumnAsInt32(session, outgoing, ColumnsInformation.OutgoingColumns["send_status"]).Value; var timeAsDate = Api.RetrieveColumnAsDouble(session, outgoing, ColumnsInformation.OutgoingColumns["time_to_send"]).Value; var time = DateTime.FromOADate(timeAsDate); logger.DebugFormat("Scanning message {0} with status {1} to be sent at {2}", msgId, value, time); if (value != OutgoingMessageStatus.Ready) continue; if (time > DateTime.Now) continue; var rowEndpoint = new Endpoint( Api.RetrieveColumnAsString(session, outgoing, ColumnsInformation.OutgoingColumns["address"]), Api.RetrieveColumnAsInt32(session, outgoing, ColumnsInformation.OutgoingColumns["port"]).Value ); if (endPoint == null) endPoint = rowEndpoint; if (endPoint.Equals(rowEndpoint) == false) continue; var rowQueue = Api.RetrieveColumnAsString(session, outgoing, ColumnsInformation.OutgoingColumns["queue"], Encoding.Unicode); if (queue == null) queue = rowQueue; if(queue != rowQueue) continue; logger.DebugFormat("Adding message {0} to returned messages", msgId); var bookmark = new MessageBookmark(); Api.JetGetBookmark(session, outgoing, bookmark.Bookmark, bookmark.Size, out bookmark.Size); var headerAsQueryString = Api.RetrieveColumnAsString(session, outgoing, ColumnsInformation.OutgoingColumns["headers"],Encoding.Unicode); messages.Add(new PersistentMessage { Id = new MessageId { SourceInstanceId = instanceId, MessageIdentifier = msgId }, Headers = HttpUtility.ParseQueryString(headerAsQueryString), Queue = rowQueue, SubQueue = Api.RetrieveColumnAsString(session, outgoing, ColumnsInformation.OutgoingColumns["subqueue"], Encoding.Unicode), Priority = Api.RetrieveColumnAsInt16(session, outgoing, ColumnsInformation.OutgoingColumns["priority"]).Value, SentAt = DateTime.FromOADate(Api.RetrieveColumnAsDouble(session, outgoing, ColumnsInformation.OutgoingColumns["sent_at"]).Value), Data = Api.RetrieveColumn(session, outgoing, ColumnsInformation.OutgoingColumns["data"]), Bookmark = bookmark }); using (var update = new Update(session, outgoing, JET_prep.Replace)) { Api.SetColumn(session, outgoing, ColumnsInformation.OutgoingColumns["send_status"], (int)OutgoingMessageStatus.InFlight); update.Save(); } logger.DebugFormat("Marking output message {0} as InFlight", msgId); if (maxNumberOfMessage < messages.Count) break; if (maxSizeOfMessagesInTotal < messages.Sum(x => x.Data.Length)) break; } return messages; }
public IList<PersistentMessage> GetMessagesToSendAndMarkThemAsInFlight(int maxNumberOfMessage, int maxSizeOfMessagesInTotal, out Endpoint endPoint) { Api.MoveBeforeFirst(session, outgoing); endPoint = null; string queue = null; var messages = new List<PersistentMessage>(); while (Api.TryMoveNext(session, outgoing)) { var msgId = new Guid(Api.RetrieveColumn(session, outgoing, ColumnsInformation.OutgoingColumns["msg_id"])); var value = (OutgoingMessageStatus)Api.RetrieveColumnAsInt32(session, outgoing, ColumnsInformation.OutgoingColumns["send_status"]).Value; var timeAsDate = Api.RetrieveColumnAsDouble(session, outgoing, ColumnsInformation.OutgoingColumns["time_to_send"]).Value; var time = DateTime.FromOADate(timeAsDate); logger.DebugFormat("Scanning message {0} with status {1} to be sent at {2}", msgId, value, time); if (value != OutgoingMessageStatus.Ready) continue; // Check if the message has expired, and move it to the outgoing history. var deliverBy = Api.RetrieveColumnAsDouble(session, outgoing, ColumnsInformation.OutgoingColumns["deliver_by"]); if (deliverBy != null) { var deliverByTime = DateTime.FromOADate(deliverBy.Value); if (deliverByTime < DateTime.Now) { logger.InfoFormat("Outgoing message {0} was not succesfully sent by its delivery time limit {1}", msgId, deliverByTime); var numOfRetries = Api.RetrieveColumnAsInt32(session, outgoing, ColumnsInformation.OutgoingColumns["number_of_retries"]).Value; MoveFailedMessageToOutgoingHistory(numOfRetries, msgId); continue; } } var maxAttempts = Api.RetrieveColumnAsInt32(session, outgoing, ColumnsInformation.OutgoingColumns["max_attempts"]); if (maxAttempts != null) { var numOfRetries = Api.RetrieveColumnAsInt32(session, outgoing, ColumnsInformation.OutgoingColumns["number_of_retries"]).Value; if (numOfRetries > maxAttempts) { logger.InfoFormat("Outgoing message {0} has reached its max attempts of {1}", msgId, maxAttempts); MoveFailedMessageToOutgoingHistory(numOfRetries, msgId); continue; } } if (time > DateTime.Now) continue; var rowEndpoint = new Endpoint( Api.RetrieveColumnAsString(session, outgoing, ColumnsInformation.OutgoingColumns["address"]), Api.RetrieveColumnAsInt32(session, outgoing, ColumnsInformation.OutgoingColumns["port"]).Value ); if (endPoint == null) endPoint = rowEndpoint; if (endPoint.Equals(rowEndpoint) == false) continue; var rowQueue = Api.RetrieveColumnAsString(session, outgoing, ColumnsInformation.OutgoingColumns["queue"], Encoding.Unicode); if (queue == null) queue = rowQueue; if(queue != rowQueue) continue; var bookmark = new MessageBookmark(); Api.JetGetBookmark(session, outgoing, bookmark.Bookmark, bookmark.Size, out bookmark.Size); logger.DebugFormat("Adding message {0} to returned messages", msgId); var headerAsQueryString = Api.RetrieveColumnAsString(session, outgoing, ColumnsInformation.OutgoingColumns["headers"],Encoding.Unicode); messages.Add(new PersistentMessage { Id = new MessageId { SourceInstanceId = instanceId, MessageIdentifier = msgId }, Headers = HttpUtility.ParseQueryString(headerAsQueryString), Queue = rowQueue, SubQueue = Api.RetrieveColumnAsString(session, outgoing, ColumnsInformation.OutgoingColumns["subqueue"], Encoding.Unicode), SentAt = DateTime.FromOADate(Api.RetrieveColumnAsDouble(session, outgoing, ColumnsInformation.OutgoingColumns["sent_at"]).Value), Data = Api.RetrieveColumn(session, outgoing, ColumnsInformation.OutgoingColumns["data"]), Bookmark = bookmark }); using (var update = new Update(session, outgoing, JET_prep.Replace)) { Api.SetColumn(session, outgoing, ColumnsInformation.OutgoingColumns["send_status"], (int)OutgoingMessageStatus.InFlight); update.Save(); } logger.DebugFormat("Marking output message {0} as InFlight", msgId); if (maxNumberOfMessage < messages.Count) break; if (maxSizeOfMessagesInTotal < messages.Sum(x => x.Data.Length)) break; } return messages; }