public void Listen()
{
try
{
using (var queue = new MessageQueue(_inputQueue.GetQueueFormatName()))
{
queue.MessageReadPropertyFilter.ResponseQueue = true;
queue.MessageReadPropertyFilter.SourceMachine = true;
queue.Formatter = new MsmqMessageFormatter();
while (_continue)
{
var transaction = new MessageQueueTransaction();
try
{
transaction.Begin();
Message message = null;
try
{
message = queue.Receive(transaction);
var obj = ReadMessageBody(message);
if (obj != null && obj is ShutdownBusMessage)
{
transaction.Commit();
continue;
}
_logger.Info("Received message {0} from sender {1}@{2}",
obj.GetType().FullName,
message.ResponseQueue.MachineName,
message.ResponseQueue.QueueName);
var arrived = NewMessageArrived;
if (arrived != null)
arrived(obj);
}
catch (HandlerException handlerException)
{
SendToErrorQueue(message, transaction, handlerException);
}
catch (DesearilazationException desearilazationException)
{
SendToErrorQueue(message, transaction, desearilazationException);
}
transaction.Commit();
}
catch (MessageQueueException mqe)
{
if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
continue;
transaction.Abort();
throw;
}
catch (Exception exception)
{
transaction.Abort();
throw;
}
}
}
}
catch (System.Threading.ThreadAbortException abortException)
{
var wrapper = new Exception(String.Format("Thread listener was aborted in Service Bus [{0}]", _serviceBusName), abortException);
_logger.FatalException("", wrapper);
}
catch (Exception ex)
{
var wrapper = new Exception(String.Format("Fatal exception in Service Bus [{0}]", _serviceBusName), ex);
_logger.FatalException("", wrapper);
throw wrapper;
}
}