private void PostDeliver(IMessage m) { AbstractQmsMessage msg = (AbstractQmsMessage)m; switch (AcknowledgeMode) { case AcknowledgeMode.DupsOkAcknowledge: if (++_outstanding >= _prefetchHigh) { _dups_ok_acknowledge_send = true; } if (_outstanding <= _prefetchLow) { _dups_ok_acknowledge_send = false; } if (_dups_ok_acknowledge_send) { _channel.AcknowledgeMessage((ulong)msg.DeliveryTag, true); } break; case AcknowledgeMode.AutoAcknowledge: _channel.AcknowledgeMessage((ulong)msg.DeliveryTag, true); break; case AcknowledgeMode.SessionTransacted: _receivedDeliveryTags.AddLast(msg.DeliveryTag); break; } }
private void SendImpl(string exchangeName, string routingKey, AbstractQmsMessage message, DeliveryMode deliveryMode, int priority, uint timeToLive, bool mandatory, bool immediate) { // todo: handle session access ticket AMQFrame publishFrame = BasicPublishBody.CreateAMQFrame( _channel.ChannelId, 0, exchangeName, routingKey, mandatory, immediate ); // fix message properties if (!_disableTimestamps) { message.Timestamp = DateTime.UtcNow.Ticks; if (timeToLive != 0) { message.Expiration = message.Timestamp + timeToLive; } } else { message.Expiration = 0; } message.DeliveryMode = deliveryMode; message.Priority = (byte)priority; ByteBuffer payload = message.Data; int payloadLength = payload.Limit; ContentBody[] contentBodies = CreateContentBodies(payload); AMQFrame[] frames = new AMQFrame[2 + contentBodies.Length]; for (int i = 0; i < contentBodies.Length; i++) { frames[2 + i] = ContentBody.CreateAMQFrame(_channelId, contentBodies[i]); } if (contentBodies.Length > 0 && _logger.IsDebugEnabled) { _logger.Debug(string.Format("Sending content body frames to {{exchangeName={0} routingKey={1}}}", exchangeName, routingKey)); } // weight argument of zero indicates no child content headers, just bodies AMQFrame contentHeaderFrame = ContentHeaderBody.CreateAMQFrame( _channelId, AmqChannel.BASIC_CONTENT_TYPE, 0, message.ContentHeaderProperties, (uint)payloadLength ); if (_logger.IsDebugEnabled) { _logger.Debug(string.Format("Sending content header frame to {{exchangeName={0} routingKey={1}}}", exchangeName, routingKey)); } frames[0] = publishFrame; frames[1] = contentHeaderFrame; CompositeAMQDataBlock compositeFrame = new CompositeAMQDataBlock(frames); lock (_channel.Connection.FailoverMutex) { _channel.Connection.ProtocolWriter.Write(compositeFrame); } }
private void PreDeliver(AbstractQmsMessage msg) { switch (AcknowledgeMode) { case AcknowledgeMode.PreAcknowledge: _channel.AcknowledgeMessage((ulong)msg.DeliveryTag, false); break; case AcknowledgeMode.ClientAcknowledge: // We set the session so that when the user calls acknowledge() it can call the method on session // to send out the appropriate frame. //msg.setAMQSession(_session); msg.Channel = _channel; break; } }
/** * Called from the AMQSession when a message has arrived for this consumer. This methods handles both the case * of a message listener or a synchronous receive() caller. * * @param messageFrame the raw unprocessed mesage * @param channelId channel on which this message was sent */ internal void NotifyMessage(UnprocessedMessage messageFrame, int channelId) { if (_logger.IsDebugEnabled) { _logger.Debug("notifyMessage called with message number " + messageFrame.DeliverBody.DeliveryTag); } try { AbstractQmsMessage jmsMessage = _messageFactory.CreateMessage((long)messageFrame.DeliverBody.DeliveryTag, messageFrame.DeliverBody.Redelivered, messageFrame.ContentHeader, messageFrame.Bodies); _logger.Debug("Message is of type: " + jmsMessage.GetType().Name); PreDeliver(jmsMessage); if (IsMessageListenerSet) { // We do not need a lock around the test above, and the dispatch below as it is invalid // for an application to alter an installed listener while the session is started. #if __MonoCS__ _messageListener(jmsMessage); #else _messageListener.Invoke(jmsMessage); #endif PostDeliver(jmsMessage); } else { _messageQueue.Enqueue(jmsMessage); } } catch (Exception e) { _logger.Error("Caught exception (dump follows) - ignoring...", e); // FIXME } }