Множественные ответы на один запрос в NServiceBus достигают пункта назначения только после завершения выполнения метода Handle
Чтобы повысить отзывчивость приложения, обработчик сообщений отвечает несколькими ответами. Однако было отмечено, что сообщения доставляются в пункт назначения только после того, как обработка сообщений полностью завершена, даже если транзакция отключена следующим образом: var busConfiguration = new BusConfiguration();. BusConfiguration.Transactions() Отключить ();
у нас есть следующий код: использование MyMessages; используя NServiceBus; используя Систему;
public class RequestDataMessageHandler : IHandleMessages<RequestDataMessage>
{
public IBus Bus { get; set; }
public void Handle(RequestDataMessage message)
{
Console.WriteLine("Received request {0}.", message.DataId);
Console.WriteLine("String received: {0}.", message.String);
var response1 = new DataResponseMessage
{
DataId = message.DataId,
String = "InProgress"
};
Bus.Reply(response1);
try
{
TimeConsumingActivity();
var response = new DataResponseMessage
{
DataId = message.DataId,
String = message.String
};
Bus.Reply(response);
}
catch
{
var response2 = new DataResponseMessage
{
DataId = message.DataId,
String = "Error in the process"
};
Bus.Reply(response2);
}
}
}
но наблюдатель отмечает, что response1 и response достигают пункта назначения только после выполнения TimeConsumingActivity (это не проблема порядка)
2 ответа
Пытаться:
busConfiguration.Transactions().DoNotWrapHandlersExecutionInATransactionScope();
Итак, это в меру моего понимания. Есть несколько параметров, относящихся к транзакциям в конфигурации NSB, и я не уверен, что могу точно описать различия между ними.
Приведенная выше настройка должна препятствовать переносу ваших обработчиков в TransactionScope, который (если не отключен) может учитывать ответное сообщение, которое не будет "передано" на шину до завершения транзакции.