コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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;
            }
        }
コード例 #4
0
        /**
         * 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
            }
        }