private void ConsumerOnReceived(object sender, BasicDeliverEventArgs e) { try { var props = new LinkMessageProperties(); props.Extend(e.BasicProperties); var recieveProps = new LinkRecieveProperties(e.Redelivered, e.Exchange, e.RoutingKey, _queue.Name, props.AppId == _appId); var token = _consumerCancellationTokenSource.Token; var msg = new LinkConsumedMessage <byte[]>(e.Body, props, recieveProps, token); HandleMessageAsync(msg, e.DeliveryTag); } catch (Exception ex) { _logger.Error($"Recieve message error, NACKing: {ex}"); try { _actionQueue.Put(new LinkConsumerMessageAction( e.DeliveryTag, LinkConsumerAckStrategy.Nack, _consumerCancellationTokenSource.Token) ); } catch { // No-op } } }
private void HandleMessageAsync(LinkConsumedMessage <byte[]> msg, ulong deliveryTag) { var cancellation = msg.Cancellation; Task <LinkConsumerAckStrategy> task; try { task = _configuration.MessageHandler(msg); } catch (Exception ex) { task = Task.FromException <LinkConsumerAckStrategy>(ex); } task.ContinueWith( t => OnMessageHandledAsync(t, deliveryTag, cancellation), cancellation, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Current ); }
public static LinkConsumerMessageHandlerBuilder Create <TBody>( LinkConsumerMessageHandlerDelegate <TBody> onMessage ) where TBody : class { if (typeof(TBody) == typeof(byte[]) || typeof(TBody) == typeof(object)) { throw new ArgumentException("Type of TBody must be concrete and not equal byte[]"); } return(new LinkConsumerMessageHandlerBuilder( (serializer, mapping) => msg => { TBody body; var props = msg.Properties.Clone(); try { body = serializer.Deserialize <TBody>(msg.Body, props); } catch (Exception ex) { var sException = new LinkDeserializationException(msg, typeof(TBody), ex); return Task.FromException <LinkConsumerAckStrategy>(sException); } var concreteMsg = new LinkConsumedMessage <TBody>( body, props, msg.ReceiveProperties, msg.Cancellation ); return onMessage(concreteMsg); }, true, false )); }