public Task Init(Func<MessageContext, Task> onMessage, Func<ErrorContext, Task<ErrorHandleResult>> onError, CriticalError criticalError, PushSettings settings)
{
peekCircuitBreaker = new RepeatedFailuresOverTimeCircuitBreaker("MsmqPeek", TimeSpan.FromSeconds(30), ex => criticalError.Raise("Failed to peek " + settings.InputQueue, ex));
receiveCircuitBreaker = new RepeatedFailuresOverTimeCircuitBreaker("MsmqReceive", TimeSpan.FromSeconds(30), ex => criticalError.Raise("Failed to receive from " + settings.InputQueue, ex));
var inputAddress = MsmqAddress.Parse(settings.InputQueue);
var errorAddress = MsmqAddress.Parse(settings.ErrorQueue);
if (!string.Equals(inputAddress.Machine, RuntimeEnvironment.MachineName, StringComparison.OrdinalIgnoreCase))
{
throw new Exception($"MSMQ Dequeuing can only run against the local machine. Invalid inputQueue name '{settings.InputQueue}'.");
}
inputQueue = new MessageQueue(inputAddress.FullPath, false, true, QueueAccessMode.Receive);
errorQueue = new MessageQueue(errorAddress.FullPath, false, true, QueueAccessMode.Send);
if (settings.RequiredTransactionMode != TransportTransactionMode.None && !QueueIsTransactional())
{
throw new ArgumentException($"Queue must be transactional if you configure the endpoint to be transactional ({settings.InputQueue}).");
}
inputQueue.MessageReadPropertyFilter = DefaultReadPropertyFilter;
if (settings.PurgeOnStartup)
{
inputQueue.Purge();
}
receiveStrategy = receiveStrategyFactory(settings.RequiredTransactionMode);
receiveStrategy.Init(inputQueue, errorQueue, onMessage, onError, criticalError);
return TaskEx.CompletedTask;
}