Я пытаюсь прочитать данные из приватной очереди MSMQ, и я пытаюсь протестировать сбой, чтобы быть уверенным, что если процесс не завершится, то детали останутся в очереди , На данный момент в пределах моей транзакции он попадает в мою новую строку Exception и, как и ожидалось, попадает в блок catch, но выглядит так, как будто транзакция. Завершено, потому что после того, как исключение было выбрано, очередь пуста: вот мой фрагмент кода -MSMQ игнорируя объем транзакции
try
{
using (TransactionScope transaction = new TransactionScope())
{
Message incoming = new Message
{
Formatter = formatter,
AcknowledgeType = AcknowledgeTypes.FullReceive,
Recoverable = true
};
incoming = msgQ.Receive(new TimeSpan(0, 0, 3), MessageQueueTransactionType.Single);
if (incoming != null)
{
MemoryStream mem = (MemoryStream) incoming.BodyStream;
mem.Seek(0, SeekOrigin.Begin);
IFormatter ifm = new BinaryFormatter();
var deserialisedMessage = (TravelMessageServiceObjects) ifm.Deserialize(mem);
ISubmissionsService submissionsService = new SubmissionsService();
bool retVal = submissionsService.PerformSubmission(deserialisedMessage.Products, deserialisedMessage.PolicyReference);
if (!retVal)
{
string errorMessage = string.Concat("Policy Ref: ", deserialisedMessage.PolicyReference,
" Product: ", Enum.GetName(typeof(Products), deserialisedMessage.Products));
throw new Exception(errorMessage);
}
}
transaction.Complete();
}
}
catch (Exception ex)
{
IError logger = new Logger();
logger.Log(this, SeverityEnum.Warning, ex);
}
Да, это транзакционный. – bilpor
Я также попытался изменить класс transactionScope на MessageQueueTransaction. MessageQueueTransaction transaction = new MessageQueueTransaction(); try {transaction.Begin(); Message incoming = msgq.Receive (новый TimeSpan (0,0,3), транзакция); и теперь я получаю сообщение об ошибке в строке «Получение»: последовательность транзакций транзакций недействительна. – bilpor
@bilpor обновил мой ответ, попробуйте это, пожалуйста, – Backs