예제 #1
0
		/// <summary>
		/// Clients can call this method to commit the transaction. You should only use this method if 
		/// you used the begin method to create the DataServiceTransaction. 
		/// Otherwise, the gateway will commit or rollback the transaction as necessary.
		/// </summary>
		public void Commit() {
			if (_rollbackOnly) {
				Rollback();
				return;
			}

			try {
				ProcessRefreshFills();

				_pushMessages = new ArrayList();
				for (int i = 0; i < _processedMessageBatches.Count; i++) {
					MessageBatch messageBatch = _processedMessageBatches[i] as MessageBatch;
					if (messageBatch.Messages != null && messageBatch.Messages.Count > 0) {
						DataDestination dataDestination = _dataService.GetDestination(messageBatch.IncomingMessage) as DataDestination;
						try {
							dataDestination.SequenceManager.ManageMessageBatch(messageBatch, this);
						} catch (Exception ex) {
							MessageException messageException = new MessageException(ex);
							ErrorMessage errorMessage = messageException.GetErrorMessage();
							errorMessage.correlationId = messageBatch.IncomingMessage.messageId;
							errorMessage.destination = messageBatch.IncomingMessage.destination;
							messageBatch.Messages.Clear();
							messageBatch.Messages.Add(errorMessage);
						}
						for (int j = 0; j < messageBatch.Messages.Count; j++) {
							IMessage message = messageBatch.Messages[j] as IMessage;

							if (!(message is ErrorMessage))
								_pushMessages.Add(message);
						}
					}
					_outgoingMessages.AddRange(messageBatch.Messages);
				}

				for (int i = 0; i < _pushMessages.Count; i++) {
					IMessage message = _pushMessages[i] as IMessage;
					DataMessage dataMessage = message as DataMessage;
					if (dataMessage != null)
						PushMessage(GetSubscribers(message), message);
				}
				foreach (DictionaryEntry entry in _clientUpdateCollectionMessages) {
					UpdateCollectionMessage updateCollectionMessage = entry.Value as UpdateCollectionMessage;
					_outgoingMessages.Add(updateCollectionMessage);
					PushMessage(GetSubscribers(updateCollectionMessage), updateCollectionMessage);
				}
				foreach (DictionaryEntry entry in _updateCollectionMessages) {
					UpdateCollectionMessage updateCollectionMessage = entry.Value as UpdateCollectionMessage;
					_outgoingMessages.Add(updateCollectionMessage);
					PushMessage(GetSubscribers(updateCollectionMessage), updateCollectionMessage);
				}
			} finally {
				_transactionState = TransactionState.Committed;
			}
		}
예제 #2
0
		private IList Batch(DataMessage dataMessage) {
			ArrayList result = new ArrayList();
			IList messageBatch = dataMessage.body as IList;
			for (int i = 0; i < messageBatch.Count; i++) {
				IMessage message = messageBatch[i] as IMessage;
				try {
					if (message is UpdateCollectionMessage) {
						result.Add(UpdateCollection(message as UpdateCollectionMessage, messageBatch));
					} else {
						object obj = Invoke(message);
						result.Add(obj);
					}
				} catch (DataSyncException dataSyncException) {
					DataErrorMessage dataErrorMessage = dataSyncException.GetErrorMessage() as DataErrorMessage;
					dataErrorMessage.cause = message as DataMessage;
					dataErrorMessage.correlationId = message.messageId;
					dataErrorMessage.destination = message.destination;
					result.Add(dataErrorMessage);
				} catch (Exception exception) {
					MessageException messageException = new MessageException(exception);
					ErrorMessage errorMessage = messageException.GetErrorMessage();
					errorMessage.correlationId = message.messageId;
					errorMessage.destination = message.destination;
					result.Add(errorMessage);
				}
			}
			return result;
		}